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

重要事情说三遍

1
2
3
首先 Lambda 表达式 ()->{ } 是一种方法实现,并且在直接调用的时候才会执行。
首先 Lambda 表达式 ()->{ } 是一种方法实现,并且在直接调用的时候才会执行。
首先 Lambda 表达式 ()->{ } 是一种方法实现,并且在直接调用的时候才会执行。

1. 什么是 ()->{ }

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

演示执行过程:

1.声明一个 Lambda 表达式接口

2.加载一下匿名实现方法

3.执行一下

  1. 新建一个类,声明一个 Lambda 表达式接口
    1
    2
    3
    4
    5
    @FunctionalInterface
    public interface MyFunctional<T> {
    //只允许存在一个 public abstract 方法
    boolean test(T t);
    }
  2. 新建一个测试类,加载一下匿名函数实现
    用来测试 Lambda 表达式的执行顺序
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    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");
    }
    }
    执行结果:
    1
    2
    3
    4
    1. 到这一步,lambda 表达式还没有执行
    2. 传入一个参数
    3. lambda 接口调用方法时传入的参数: aaaa
    4. bbb

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