-
Lambda表达式可以很简洁的代替匿名内部类的代码编写,而匿名内部类往往是实现某一接口的一个抽象方法.
-
所以使用Lambda表达式最应该关注的应该是接口的抽象方法,并且这个接口还必须只有一个抽象方法.
-
我们称这种只有一个抽象方法的接口为—“函数式接口”. 在java中一个函数式接口可以使用 @FunctionalInterface 注解表示
-
以Runnable接口为例,Runnable接口定义如下
- Lambda 表达式在Java 语言中引入了一个新的语法元素和操作符。
->
- 该操作符被称为 Lambda 操作符或剪头操作符。它将 Lambda 分为两个部分:
- 左侧:指定了 Lambda 表达式需要的所有参数
- 右侧:指定了Lambda体,及Lambda表达式所要执行的功能
-
使用Lambda表达式来实现函数式接口有以下几种语法格式:
-
语法格式1:无参无返回值
-
使用Lambda表达式实现Runnable接口
Runnable runnable = ()-> System.out.println("hello Lambda ");
runnable.run();
- 语法格式2:一个参数
Consumer<String> consumer = (args)-> System.out.println(args);
consumer.accept("hello");
- 语法格式3:当Lambda表达式只有一个参数的时候可以忽略小括号
Consumer<String> consumer = args-> System.out.println(args);
consumer.accept("hello");
- 语法格式4:有两个单数,并且有返回值
BinaryOperator<Integer> binaryOperator = (x,y)->{
System.out.println(x+y);
return x+y;
};
Integer result = binaryOperator.apply(1, 2);
- 语法格式5:当Lambda表达式只有一条语句的时候大括号和"return"语句都可以省略
BinaryOperator<Integer> binaryOperator = (x,y)-> x+y;
语法格式6:Lambda表达式的数据类型可以省略,因为编译器可以通过上下文推断出数据类型
BinaryOperator<Integer> binaryOperator = (Integer x,Integer y)-> x+y;
类型推断
- Lambda 表达式中的参数类型都是由编译器推断得出的。Lambda 表达式中无需指定类型,程序依然可以编译,这是因为 javac 根据程序的上下文,在后台推断出了参数的类型。Lambda 表达式的类型依赖于上下文环境,是由编译器推断出来的。这就是所谓的“类型推断”