1.什么是lambda表达式?
代码块及必须传入的代码的变量规范。也可以理解为带参数变量的表达式。或称为函数式编程
(String first, String second)->
{
first.length() - second.length()
}
在这里你可能会想怎么去知道这个表达式的值是多少?
lambda表达式的返回类型是由上下文推导得出。
注意:lambda表达式中若有分支结构,且其中某个分支有返回值return,那么每个分支都必须有返回值。
2.函数式接口
函数式接口是只包含一个抽象方法的接口,该抽象方法的签名称作函数式接口的函数描述符。假如函数式接口的函数描述符为 ()->void ,则该接口包含的抽象方法的入参、出参皆为空。
作用: 1.编译器通过上下文所期待的类型(该类型被称作目标类型)来推导 lambda 表达式类型。也就是说,同样的表达式可以拥有不同的类型。
2.延迟操作,实现懒计算
package lambda;
/**
* @author wangchuang
* @Version 8
* @since 2021 10 2021/10/31 15:02
*/
@FunctionalInterface
interface MessageBuilder {
String buildMessage();
}
public class Demo02LoggerLambda {
private static void log(int level, MessageBuilder builder) {
if (level == 1) {
System.out.println(builder.buildMessage());// 实际上利用内部类 延迟的原理,代码不相关 无需进入到启动代理执行
}
}
public static void main(String[] args) {
String msgA = "Hello";
String msgB = "World";
String msgC = "Java";
log(1,()->{
System.out.println("lambda 是否执行了");
return msgA + msgB + msgC;
});
}
}
3.方法引用
只有当lambda表达式只掉用一个方法而不做其他操作时,才能把lambda表达式重写为方法引用 Math::pow 等价于 (x, y) -> Math.pow(x, y)
使用方式
object::instanceMethod
Class::instanceMethod
Class::staticMethod
4.构造器引用
可以理解为方法引用的特例,只是方法名为new。 例如:Person::new int[]::new
注意:泛型是无法进行构造器引用的
5.变量作用域
lambda表达式捕获的变量必须是事实最终变量(即后面不会对这个变量赋新值)。
6.为什么使用lambda表达式
延迟执行