7.8 Lambda表达式
Lambda表达式是JDK 8引入的一项功能,它使得Java代码变得更加简洁且具有表达力,特别是在集合的遍历和其他操作中。Lambda表达式可以在很多情况下替代匿名内部类,简化代码的编写。此外,JDK还提供了大量内置的函数式接口,使得使用Lambda表达式变得更为方便和高效。
Lambda表达式的组成
Lambda表达式由以下三个部分组成:
- 参数列表 - 可以包含零个或多个参数。
- 箭头符号 (->) - 用于分隔参数列表和Lambda体。
- 方法体 - 可以是一个单一表达式或一个语句块。
方法体如果是表达式,那么Lambda表达式的结果就是该表达式的结果;如果是一个语句块,语句块内的语句将被执行。
Lambda表达式的常用语法格式
以下是Lambda表达式的一些常用语法格式:
() -> System.out.println("Hello Lambda!");
- 无参数,执行一个动作但不返回值。
(x) -> System.out.println(x)
- 一个参数,无返回值。
x -> System.out.println(x)
- 若只有一个参数,可以省略参数的括号。
(x, y) -> { System.out.println("函数式接口"); return Integer.compare(x, y); }
- 有两个参数并且Lambda体包含多条语句,有返回值。
(x, y) -> Integer.compare(x, y)
- 如果Lambda体仅有一条语句,可以省略
return
关键字及花括号。
- 如果Lambda体仅有一条语句,可以省略
(Integer x, Integer y) -> Integer.compare(x, y)
- 参数类型通常可以省略,因为JVM可以根据上下文推断出数据类型。
示例应用:排序字符串数组
在下面的Java程序中,我们将使用两种不同的Lambda表达式来对字符串数组进行排序。
文件7-28 Example28.java
import java.util.Arrays;
public class Example28 {
public static void main(String[] args) {
String[] arr = {"program", "creek", "is", "a", "Java", "site"};
// 使用Lambda表达式按字符串长度排序
Arrays.sort(arr, (m, n) -> Integer.compare(m.length(), n.length()));
System.out.println("Lambda语句体中只有一条语句,参数类型可推断:" +
Arrays.toString(arr));
// 使用复杂Lambda表达式按长度逆序排序
Arrays.sort(arr, (String m, String n) -> {
if (m.length() > n.length())
return -1;
else if (m.length() < n.length())
return 1;
else
return 0;
});
System.out.println("Lambda语句体中有多条语句:" + Arrays.toString(arr));
}
}
运行结果
这个示例展示了如何使用不同类型的Lambda表达式对数组进行排序。第一个排序操作将数组按照字符串长度升序排列,第二个则进行了逆序排列。
- 输出结果:
- 第一次排序结果:
[a, is, Java, site, creek, program]
- 第二次排序结果:
[program, creek, Java, site, is, a]
- 第一次排序结果:
Lambda表达式不仅提高了代码的可读性和简洁性,还加快了开发过程,特别是在处理集合和数组等数据结构时。通过上述示例,我们可以看到Lambda表达式在实际编程中的强大功能和灵活性。