你为什么学不会lambda

2023-10-20 12:47:38 浏览数 (2)

这个一篇对学习 Lambda 表达式进行解惑的文章,主要是总结了自己在学习 Lambda 表达式时候的一些理解不了的坑进行总结。长篇大论和详细语法,自行谷歌,这里只说一些理解起来不顺的概念。

重要事情说三遍

代码语言:javascript复制
首先 Lambda 表达式 ()->{ } 是一种方法实现,并且在直接调用的时候才会执行。
首先 Lambda 表达式 ()->{ } 是一种方法实现,并且在直接调用的时候才会执行。
首先 Lambda 表达式 ()->{ } 是一种方法实现,并且在直接调用的时候才会执行。

1. 什么是 ()->{ }

理论造航母,程序就一行。 不提什么是函数式编程,用大白话,其实就是写了一个匿名实现,并且在需要使用这行匿名实现的时候调用了一下,才会直正去执行这个匿名实现方法。 Lambda 表达式,本质上是一种延迟加载执行。将预先写好的实现方法进行加载。到实际使用时,再执行。

演示执行过程:

1.声明一个 Lambda 表达式接口
2.加载一下匿名实现方法
3.执行一下

新建一个类,声明一个 Lambda 表达式接口

代码语言:javascript复制
@FunctionalInterface
public interface MyFunctional<T> {
    //只允许存在一个 public abstract 方法
    boolean test(T t);
}

新建一个测试类,加载一下匿名函数实现 用来测试 Lambda 表达式的执行顺序

代码语言:javascript复制
public class MethodReference {
   public static void main(String[] args) {
        //1. 一般匿名写法,这里仅是声明了这个匿名写法,但是并没有执行任务操作
        testRef((test) -> {
            System.out.println(String.format("3. lambda 接口调用方法时传入的参数: %s", test));
            System.out.println("4.bbb");
            return test;
        });
    }

    public static void testRef(MyFunctional myFunctional) {

        System.out.println("1. 到这一步,lambda 表达式还没有执行");
        System.out.println("2. 传入一个参数");
        // 2. 真正的去调用 lambda 表达式的实现方法
        myFunctional.say("aaa");
    }
}

执行结果:

代码语言:javascript复制
1. 到这一步,lambda 表达式还没有执行
2. 传入一个参数
3. lambda 接口调用方法时传入的参数: aaaa
4. bbb

用 IDEA 到 Functional 接口中点一下,可以看到,直接跳到 MethodReference 这个测试为的这一行 lambda 表达式中,也就是说,当有一个 lambda 表达式实现了 Functional 接口时,并通过以当前 Functional 为形参的方法传入时,可以被调用到。

0 人点赞