跳转到主要内容
模块 7 · 第 1 课(共 2)课程中的13/14~12 min
模块课程(1/2)

拉姆达表达式

从 Java 8 开始,通过 Lambda 表达式 支持函数式编程。 lambda 表达式本质上是一个匿名方法(没有名称的函数),可以作为参数传递给方法或存储在变量中。

功能接口

lambda 表达式只能用在需要 函数式接口 的地方。函数式接口是一种声明恰好一个抽象方法的接口。 Java 使用可选的 @FunctionalInterface 注释来标记这些接口。

用户定义的功能接口示例:

Java
@FunctionalInterface
interface MathOperation {
    int operate(int a, int b);
}

在 Java 8 之前,您必须定义一个匿名内部类。使用 lambda,语法可以简化为:

Java
MathOperation addition = (a, b) -> a + b;
int result = addition.operate(5, 3); // Returns 8

Lambda 表达式的结构

lambda 的基本语法是:

Code
(parameters) -> { body }
  • 不带参数:() -> System.out.println("Hello")
  • 单个参数:x -> x * 2(括号可以省略)
  • 多个参数:(x, y) -> x + y
  • 多行正文:如果正文包含多个语句,则需要大括号 {} 和显式 return 语句。
Java
MathOperation detailedAddition = (a, b) -> {
    System.out.println("Adding...");
    return a + b;
};

Java 中的标准函数式接口

java.util.function 包提供了几个内置的函数接口:

  • Predicate<T>:接受 T 类型的参数并返回一个布尔值(test(T t) 方法)。
  • Consumer<T>:接受 T 类型的参数并执行操作而不返回结果(accept(T t) 方法)。
  • Function<T, R>:接受参数 T 并返回结果 R (apply(T t) 方法)。
  • Supplier<T>:不接受任何参数并返回 T 类型的值(get() 方法)。

自己尝试一下

锻炼#java.m7.l1.e1
尝试:0加载中...

通过使用将两个整数相加的 lambda 表达式实例化 Calculator 接口来完成代码。然后,调用计算方法并传递 5 和 3,并打印结果。

正在加载编辑器...
显示提示

声明“Calculator adder = (a, b) -> a + b;”,然后在 print 调用中调用“adder.calculate(5, 3)”。

3 次尝试后可用的解决方案

锻炼#java.m7.l1.e2
尝试:0加载中...

使用 lambda 表达式创建一个名为 isLong 的标准函数接口 Predicate<String> 实例,该表达式检查字符串长度是否大于 5 个字符。然后打印“hello world”的测试结果。

正在加载编辑器...
显示提示

`Predicate<String>` 的 lambda 接受参数 `s` 并返回 `s.length() > 5` 作为布尔条件。

3 次尝试后可用的解决方案

锻炼#java.m7.l1.e3
尝试:0加载中...

通过调用 sort() 方法并传递实现 Comparator 的 lambda 表达式(获取两个字符串 s1、s2 并使用 CompareTo 进行比较),按字母顺序对字符串名称列表进行排序。

正在加载编辑器...
显示提示

使用“names.sort((s1, s2) -> s1.compareTo(s2));”对列表进行就地排序。

3 次尝试后可用的解决方案