lambda表达式

206 阅读2分钟

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表达式

延迟执行