Lambda 表达式与 Stream API

JavaBeginner
立即练习

介绍

在本实验中,你将学习如何使用 Java 8 的两个最重要的特性——Lambda 表达式和 Stream API。Lambda 表达式用于创建可以作为参数传递给其他方法的匿名函数,而 Stream API 用于对集合执行一系列操作。

设置 Java 环境

首先,通过在你的系统上安装最新版本的 Java 来设置 Java 环境。你可以从官方网站下载并安装 Java。安装完成后,打开终端并检查 Java 的版本。

java -version

创建 Java 文件

接下来,在你的 ~/project 目录下创建一个名为 LambdaExpressions.java 的新 Java 文件。

touch ~/project/LambdaExpressions.java

在这个文件中,我们将编写代码来实现 Lambda 表达式和 Stream API。

使用 Lambda 表达式计算两个数字的和

Lambda 表达式提供了一种简单的方式来创建匿名函数。创建一个 FunctionalInterface,它将表示一个接受两个数字作为输入并返回它们和的函数。

interface Calculator {
  int sum(int a, int b);
}

接下来,我们可以使用 Lambda 表达式创建该接口的对象,然后使用该对象调用 sum() 函数。

  Calculator adder = (a, b) -> a + b;
  int result = adder.sum(10, 20);
  System.out.println("Result: " + result);

现在,使用以下命令编译并运行此代码:

javac ~/project/LambdaExpressions.java && java LambdaExpressions

输出应为:

Result: 30

使用 Stream API 遍历集合

Stream API 用于对集合执行一系列操作。在这一步中,我们将学习如何遍历一个字符串集合,并过滤出以 "A" 开头的字符串。

创建一个包含一些名字的字符串列表以便操作。

List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "Dave", "Andy");

接下来,使用 Stream API 遍历该集合,过滤出以 "A" 开头的字符串,并将剩余的字符串打印到控制台。

  names.stream().filter(s -> s.startsWith("A")).forEach(System.out::println);

现在,使用以下命令编译并运行此代码:

javac ~/project/LambdaExpressions.java && java LambdaExpressions

输出应为:

Alice
Andy

使用 Stream API 从整数列表中查找最大值和最小值

Stream API 提供了一种对集合执行一系列操作的方式。在这一步中,我们将学习如何使用 Stream API 从整数列表中查找最大值和最小值。

创建一个整数列表:

List<Integer> numbers = Arrays.asList(10, 2, 30, 5, 4, 20);

使用 Stream API 查找列表中的最大值:

Optional<Integer> maxNum = numbers.stream().max(Integer::compareTo);
System.out.println("Maximum number: " + maxNum.get());

使用 Stream API 查找列表中的最小值:

Optional<Integer> minNum = numbers.stream().min(Integer::compareTo);
System.out.println("Minimum number: " + minNum.get());

现在,使用以下命令编译并运行此代码:

javac ~/project/LambdaExpressions.java && java LambdaExpressions

输出应为:

Maximum number: 30
Minimum number: 2

使用 forEach() 打印列表中的元素

我们可以使用 Stream API 的 forEach() 方法来遍历列表并对每个元素执行操作。

创建一个包含一些名字的字符串列表以便操作:

List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "Dave");

使用 forEach() 方法打印列表中的所有元素:

names.stream().forEach(System.out::println);

现在,使用以下命令编译并运行此代码:

javac ~/project/LambdaExpressions.java && java LambdaExpressions

输出应为:

Alice
Bob
Charlie
Dave

使用 Stream API 对集合进行排序

Stream API 可用于对集合进行排序。在这一步中,我们将学习如何对整数列表进行升序排序。

创建一个整数列表以便操作:

List<Integer> numbers = Arrays.asList(1, 3, 2, 4, 5);

使用 Stream API 的 sorted() 方法对列表进行升序排序:

numbers.stream().sorted().forEach(System.out::println);

现在,使用以下命令编译并运行此代码:

javac ~/project/LambdaExpressions.java && java LambdaExpressions

输出应为:

1
2
3
4
5

使用 Stream API 对集合进行过滤和排序

在这一步中,我们将使用 Stream API 对整数集合进行过滤和排序。

创建一个整数列表以便操作:

List<Integer> numbers = Arrays.asList(10, 2, 30, 5, 4, 20);

过滤出仅有的偶数,并使用 sorted() 方法按降序排序:

numbers.stream().filter(n -> n % 2 == 0).sorted(Comparator.reverseOrder()).forEach(System.out::println);

现在,使用以下命令编译并运行此代码:

javac ~/project/LambdaExpressions.java && java LambdaExpressions

输出应为:

30
20
10
4
2

使用 Stream API 计算集合的平均值

在这一步中,我们将学习如何使用 Stream API 获取整数集合的平均值。

创建一个整数列表以便操作:

List<Integer> numbers = Arrays.asList(10, 2, 30, 5, 4, 20);

使用 Stream API 的 average() 方法获取列表的平均值:

OptionalDouble avg = numbers.stream().mapToInt(Integer::intValue).average();
System.out.println("Average: " + avg.getAsDouble());

现在,使用以下命令编译并运行此代码:

javac ~/project/LambdaExpressions.java && java LambdaExpressions

输出应为:

Average: 12.0

创建 Optional 对象并检查其是否为空

在这一步中,我们将学习什么是 Optional 以及如何创建一个 Optional 对象。

创建一个空字符串的 Optional 对象:

Optional<String> emptyString = Optional.empty();

使用 isPresent() 方法检查该对象是否为空:

if(emptyString.isPresent()) {
    System.out.println(emptyString.get());
}
else {
    System.out.println("No value");
}

现在,使用以下命令编译并运行此代码:

javac ~/project/LambdaExpressions.java && java LambdaExpressions

输出应为:

No value

总结

在本实验中,我们学习了如何使用 Java 8 的两个最重要特性——Lambda 表达式和 Stream API。我们学习了如何使用 Lambda 表达式创建匿名函数,如何使用 Stream API 对集合执行一系列操作,以及如何创建 Optional 对象并检查其是否为空。我们还了解了如何使用 Stream API 对集合进行排序、过滤以及获取平均值。通过掌握这些特性,我们可以使用 Java 8 编写高效且简洁的代码。