模块 7 · 第 2 课(共 2)课程中的14/14~15 min
模块课程(2/2)
流媒体接口
Java 中的 Stream API 允许您利用函数式编程以声明方式处理对象集合。 Stream 不存储数据,而是通过操作管道携带来自源(例如列表或数组)的元素。
Stream 管道由三部分组成:
- 来源(例如,
list.stream()) - 零个或多个中间操作(返回新的 Stream,例如
filter、map) - 终端操作(产生最终结果或副作用并关闭流,例如
collect、forEach、reduce)
常见中间操作
中间操作是惰性的:它们在调用终端操作之前不会执行。
filter(Predicate):根据布尔条件过滤元素。map(Function):通过应用函数将每个元素转换为另一个对象。sorted():对 Stream 的元素进行排序。
Java
List<String> names = Arrays.asList("Marco", "Anna", "Giovanni");
List<String> filtered = names.stream()
.filter(name -> name.startsWith("M"))
.map(name -> name.toUpperCase())
.collect(Collectors.toList()); // "MARCO"常用终端操作
forEach(Consumer):对流的每个元素执行一个操作。collect(Collector):将流结果收集到容器中(例如,使用Collectors.toList()的列表)。reduce(identity, BinaryOperator):将流元素组合成单个累积值。
Java
List<Integer> numbers = Arrays.asList(1, 2, 3, 4);
int sum = numbers.stream()
.reduce(0, (a, b) -> a + b); // Sums all numbers: 10自己尝试一下
锻炼#java.m7.l2.e1
尝试:0加载中...
使用数字流完成代码,仅过滤偶数,将它们收集到名为 Evens 的新列表中,并使用 System.out.println 打印它。
正在加载编辑器...
显示提示
首先调用 `numbers.stream()`,附加 `.filter(n -> n % 2 == 0)`,最后使用 `.collect(Collectors.toList())` 进行收集。
3 次尝试后可用的解决方案
锻炼#java.m7.l2.e2
尝试:0加载中...
使用流使用 map 将名称列表中的所有名称转换为大写,并使用 forEach 和方法引用将它们一一打印出来。
正在加载编辑器...
显示提示
使用 `.map(s -> s.toUpperCase())` 后跟终端操作 `.forEach(System.out::println)`。
3 次尝试后可用的解决方案
锻炼#java.m7.l2.e3
尝试:0加载中...
通过使用 Stream 和初始值为 0 的归约终端操作计算数字列表中所有数字的总和来完成代码。打印总和。
正在加载编辑器...
显示提示
使用“numbers.stream().reduce(0, (a, b) -> a + b)”并打印结果变量。
3 次尝试后可用的解决方案