什么是Lambda表达式?

Lambda 表达式是 Java 中的一种简洁语法,用于表示匿名函数

它是 Java 8 中引入的功能,旨在提高代码的简洁性可读性

尤其是在处理函数式编程或需要传递行为的场景下,例如集合操作、并行流处理等。

我们为什么要学习或使用Lambda表达式?

  • 代码更简洁:减少了匿名类的样板代码。

  • 更具可读性:将行为直接传递给函数。

  • 结合 Stream API 提高数据处理的效率和易读性。

什么时候可以用Lambda表达式?

如果一个接口中有且只有一个待实现的抽象方法,那么我们可以将匿名内部类简写为Lambda表达式

public static void main(String[] args) {
    Study study = () -> System.out.println("我是逆蝶!");
  	study.study();
}

注意事项

  • Lambda 表达式只能用于函数式接口(接口中有且只有一个抽象方法)。

  • 如果需要使用外部变量,它必须是隐式 final(不能在 Lambda 表达式内外修改其值)。

Lambda 表达式的语法

基本语法结构为:

(参数列表) -> {方法体}

构成部分

  1. 参数列表:可以有零个、一个或多个参数,参数类型可以省略(由编译器推断)。

  2. 箭头符号 (->):分隔参数列表和方法体。

  3. 方法体:包含 Lambda 表达式的逻辑,可用一条或多条语句。

或者可以这么表示:

([参数类型 参数名称,]...) ‐> { 代码语句,包括返回值 }
  1. 和匿名内部类不同,Lambda仅支持接口,不支持抽象类

  2. 接口内部必须有且仅有一个抽象方法(可以有多个方法,但是必须保证其他方法有默认实现,必须留一个抽象方法出来)

示例

1. 无参数的 Lambda 表达式

() -> System.out.println("Hello Lambda!");

2. 有一个参数的 Lambda 表达式

x -> System.out.println(x);

3. 有多个参数的 Lambda 表达式

(a, b) -> a + b

4. 有多条语句的方法体

(x, y) -> { int sum = x + y; return sum; }

没看懂?那让我们举一个不那么抽象的例子:

@FunctionalInterface   //添加了此注解的接口,都支持lambda表达式,符合函数式接口定义
public interface Runnable {
    public abstract void run();   //有且仅有一个抽象方法,此方法返回值为void,且没有参数
}

因此,Runable的的匿名内部类实现,就可以简写为:

Runnable runnable = () -> {    };

我们也可以写一个玩玩:

@FunctionalInterface
public interface Test {   //接口类型
    String test(Integer i);    //只有这一个抽象方法,且接受一个int类型参数,返回一个String类型结果
}

它的Lambda表达式的实现就可以写为:

Test test = (Integer i) -> { return i+""; };  //这里我们就简单将i转换为字符串形式