Java中的Lambda表达式

Lambda表达式在C++、Java等多种语言中都存在。但是在使用上都存在细微区别。
在Java中,Lambda允许使用更简洁的当时表示匿名函数,Lambda表达式的存在能够让代码更加的简洁、清晰。

Lambda表达式的定义

Lambda 表达式是 Java 中用于“实现函数式接口唯一抽象方法”的一种简洁写法。在实际写作的过程中,我们可以在不创建新的类的情况下,编写出简洁、可复用的代码。

1
(形参)->表达体

形参:Lambda表达式的参数,可以有多个或没有。
→:箭头符号,分割了参数列表和Lambda体。
表达体:是一段可执行的代码块,通常是一个表达式,或者一组语句

Lambda表达式的重要性

如果没有Lambda表达式,我们需要实现一个接口的方法要这样写:

1
2
3
4
5
6
7
Runnable r = new Runable(){
@Override
public void run(){
//具体实现Runnable接口中定义的run()方法
System.out.println("你好");
}
}

这样写,只是为了实现一个run()方法却写了一堆代码。
当Lambda表达式后,我们的写法变成了:

1
Runnable r = () -> System.out.println("你好");

由此我们可以看出,Lambda表达式的出现,是为了代替“实现一个方法的匿名内部类”。

Lambda表达式的使用规范

函数式接口:只包含一个抽象方法的接口

示例:

1
2
3
4
@FunctionalInterface
interface MyFunc {
void run();
}

反例:

1
2
3
4
interface Bad {
void a();
void b(); // ❌
}

❗️Java 的 Lambda 只能用于接口,不能用于类或抽象类。

Lambda 表达式的语法形式

  1. 无参无返回值
1
() -> { ... }
  1. 有一个参
1
x -> x * 2
  1. 有两个参
1
(a, b) -> a + b

Lambda 表达式的本质

在Java的流处理中,我们常用filter方法,filter方法里就可以写Lambda表达式:

1
stream.filter(x -> x > 0);

等价于:

1
2
3
4
5
6
stream.filter(new Predicate<Integer>() {
@Override
public boolean test(Integer x) {
return x > 0;
}
});