一.Lamdba 表达式的基础语法
Lamdba是一个匿名函数,Lamdba表达式是一段可以传递的代码。
Java8 中引用了一个新的操作符,->
该操作符成为箭头操作符或者是Lamdba操作符,箭头操作符将Lamdba表达式拆分成两部分:参数列表 -> 执行的功能
二.Lambda表达式的重要特征
- 可选类型声明:不需要声明参数类型,编译器可以统一识别参数值。
- 可选的参数圆括号:一个参数无需定义圆括号,但多个参数需要定义圆括号。
- 可选的大括号:如果主体包含了一个语句,就不需要使用大括号。
- 可选的返回关键字:如果主体只有一个表达式返回值则编译器会自动返回值,大括号需要指定明表达式返回了一个数值。
三.Lamdba表达式的实例
1.无参数,无返回值类型
@Test
public void test1() {
Runnable runnable = new Runnable() {
@Override
public void run() {
System.out.println("Hello World!");
}
};
runnable.run();
//等价于
Runnable runnable1 = () -> System.out.println("Hello World!");
runnable1.run();
}
2.有一个参数,并且无返回值(只有一个参数,小括号可以省略)
@Test
public void test2(){
Consumer consumer1 = new Consumer() {
@Override
public void accept(Object o) {
System.out.println(o);
}
};
consumer1.accept("Hello World");
//等价于
Consumer consumer2 = item -> System.out.println(item);
consumer2.accept("Hello World");
}
3.有两个以上的参数,有返回值(一条语句可以省略return 和大括号)
@Test
public void test3(){
Comparator<Integer> comparator = (x, y) -> Integer.compare(x,y);
}
四.Lamdba表达式需要「函数式接口」的支持
函数式接口:接口中只有一个抽象方法的接口,成为函数式接口,可以用注解@FunctionalInterface修饰来检查是否是函数式接口
import org.junit.Test;
@FunctionalInterface
interface DemoInterface {
int value(int num);
}
public class Lambda {
@Test
public void test() {
int value = operation(10,num -> num * 2);
System.out.println(value);
}
public int operation(Integer x, DemoInterface demo){
return demo.value(x);
}
}
注意:
lambda 表达式只能引用标记了 final 的外层局部变量,这就是说不能在lambda 内部修改定义在域外的局部变量,否则会编译错误。
网友评论
Java 8 中的 Lambda 表达式 vs. Kotlin 中的 Lambda
https://www.jianshu.com/p/8d1c16f53dbe