问题和练习:聚合操作
原文: https://docs.oracle.com/javase/tutorial/collections/streams/QandE/questions.html
问题
- 一系列聚合操作称为 _。
- 每个管道包含零个或多个 _ 操作。
- 每个管道以 _ 操作结束。
- 什么样的操作产生另一个流作为其输出?
- 描述
forEach聚合操作与增强for语句或迭代器不同的一种方式。 - 对错:流类似于集合,因为它是存储元素的数据结构。
识别此代码中的中间和终端操作:
double average = roster.stream().filter(p -> p.getGender() == Person.Sex.MALE).mapToInt(Person::getAge).average().getAsDouble();
代码
p -> p.getGender() == Person.Sex.MALE是什么样的例子?- 代码
Person::getAge是什么样的例子? - 组合流内容并返回一个值的终端操作被称为什么?
- 列举
Stream.reduce方法和Stream.collect方法之间的一个重要区别。 - 如果要处理名称流,提取男性名称,并将它们存储在新的
List中,Stream.reduce或Stream.collect是否最适合使用? - 判断对错:聚合操作可以实现与非线程安全集合的并行性。
- 除非另有说明,否则流始终是串行的。您如何请求并行处理流?
演习
将以下增强
for语句写为具有 lambda 表达式的管道。提示:使用filter中间操作和forEach端子操作。for (Person p : roster) {if (p.getGender() == Person.Sex.MALE) {System.out.println(p.getName());}}
将以下代码转换为使用 lambda 表达式和聚合操作而不是嵌套
for循环的新实现。提示:按此顺序创建一个调用filter,sorted和collect操作的管道。List<Album> favs = new ArrayList<>();for (Album a : albums) {boolean hasFavorite = false;for (Track t : a.tracks) {if (t.rating >= 4) {hasFavorite = true;break;}}if (hasFavorite)favs.add(a);}Collections.sort(favs, new Comparator<Album>() {public int compare(Album a1, Album a2) {return a1.name.compareTo(a2.name);}});
