介绍
什么是lambda表达式?
Lambda表达式,说白了就是一个匿名函数。
lambda表达式的作用
让代码写起来,看起来都比较简洁。
01
java由于被设计为一个纯面向对象的语言,函数无法脱离类或者对象独立存在。如果实现把函数当做参数传递,那就不得不依赖Java的接口。看代码示例:
接口类:
public interface Operator {
int operate(int a,int b);
}
调用类:
public class Main {
public static void main(String[] args) {
Operator operator = new Operator() {
@Override
public int operate(int a, int b) {
return a+b;
}
};
test(operator);
}
public static void test(Operator operator){
int result = operator.operate(12,34);
System.out.println(result);
}
}
以上是大家熟悉的匿名内部类,当Java8可以支持lambda表达式之后就可以这么写了:
public class Main {
public static void main(String[] args) {
Operator operator = (a,b)->{return a+b;};
test(operator);
}
public static void test(Operator operator){
int result = operator.operate(12,34);
System.out.println(result);
}
}
这个lambda表达式其实就是对Operator接口operate方法的实现。Operator接口被叫做函数式接口。
看到这里,你肯定想说:
lambda表达式不就是将匿名内部类的写法简单化了嘛
确实如此。不过需要注意,如果Operator接口,有多个抽象方法,那就没法使用lambda表达式了。
函数式接口,有且只能有一个抽象方法。
02
有的时候,我们可能直接引用已存在的方法,为了支持方法的引用,Java8引入了::运算符。示例:
public class Main {
public static void main(String[] args) {
Operator operator = Main::add;
test(operator);
}
public static void test(Operator operator){
int result = operator.operate(12,34);
System.out.println(result);
}
public static int add(int a,int b){
return a+b;
}
}
这段代码里,我们直接将Main的静态add方法赋值给了operator,看起来是不是有点像JavaScript的function赋值啊。
如果add方法是非静态的,只需要修改成如下就可以了:
Operator operator = new Main()::add;
虽然lambda表达式让让代码更简洁了,但也让面向对象变得没那么纯了,各有利弊吧。
注意:以上代码只能在Java8中编译