跳到主要内容

Java Lambda 表达式

什么是 Lambda 表达式

Lambda 表达式是 Java 8 始支持的一种新语法,它使编程更简洁,支持函数式编程,可以支持多种函数式语言特性,如函数作为参数、函数式接口等。Lambda 表达式使得编程更加简洁,可以减少代码量,提高代码的可读性,更加易于维护。

语法:

(parameters) -> expression

// 或
(parameters) -> { statements1; statements2; }

Lambda 表达式包含三部分:

  • 参数列表(可选;如果没有参数,则括号可以省略(?))
  • 箭头符号
  • 表达式或语句块(如果表达式只有一个可以不用括号,如果有多个参数则必须使用括号

这语法有点类似 JS 箭头函数

Lambda 表达式常用方式

在 Java 领域里,使用 Lambda 表达式的方式一共有以下几种形式:

  • 函数式接口:只有一个抽象方法的接口,可以使用 lambda 表达式
  • 类型参数:使用 lambda 表达式作为参数,允许类型参数可以推断出 lambda 表达式的类型
  • 函数式方法:可以使用 lambda 表达式作为方法参数,以实现函数式接口

示例 1:

函数式接口

@FunctionalInterface
public interface MyFunctionalInterface {
void doSomething();
}

/**
* 这里实现了MyFunctionalInterface接口,
* 并使用lambda表达式实现接口中的抽象方法。
* 由于lambda表达式是支持直接通过()->的方式去调用这种声明式接口的函数的,所以写起来要相对简洁一些
*/
public class LambdaDemo {
public static void main(String[] args) {
MyFunctionalInterface myFunctionalInterface = () -> System.out.println("Lambda Expression");
myFunctionalInterface.doSomething();
}
}

示例 2:

所有在 Java 中带有 @FunctionalInterface 注解修饰的接口,都可以使用 lambda 表达式来调用,例如我们线程里面常用的 Runnable 类

/**
* 这段代码里面,其实本质都是在创建线程并启动。但是使用lambda表达式来创建线程,语法会更加精简一些
*/
public static void main(String[] args) {
new Thread(()->System.out.println("this is runnable test 1")).start();
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("this is runnable test 2");
}
});
thread.start();
}

示例 3:

类型参数

/**
* 这段代码里面,使用了lambda表达式作为参数,允许类型参数可以推断出lambda表达式的类型。
* apply方法是Function接口的一个方法,它的作用是将一个参数应用到函数中,并返回计算结果
* `Function<String,String> function = str -> str + " world!";`
*/
public class LambdaDemo {
public static <T> void doSomething(T t, Function<T, T> function) {
T result = function.apply(t);
System.out.println(result);
}

public static void main(String[] args) {
doSomething("hello", str -> str + " world!");
}
}

示例 3:

函数式方法

/**
* 这个示例说明如何使用lambda表达式作为方法参数,以实现函数式接口。
* 具体来说,可以使用lambda表达式 str -> str.toUpperCase() 作为doSomething2方法的参数,
* 以实现将字符串转换为大写形式的功能。
*/
public class LambdaDemo {
public static void doSomething2(String str, Function<String, String> function) {
String result = function.apply(str);
System.out.println(result);
}

public static void main(String[] args) {
doSomething2("hello", str -> str.toUpperCase());
}
}

Lambda 表达式的优点

Java lambda 表达式是一种新的、非常简洁的语法,用来表示一个函数接口的实例,即只有一个抽象方法的接口。

使用一对圆括号 () 和一个箭头 -> 来表示,其中参数在左侧,函数体在右侧。

优点总结如下:

  • 可以用来实现复杂的业务逻辑,例如多线程、数据流和异步处理
  • 可以让代码更加简洁,减少代码量,提高代码可读性
  • 可以在 Stream API、Collection API 等类库中使用,可以更加高效地处理集合等复杂数据结构