问题与练习:总体操作
Questions
-
一系列合计操作称为。
-
每个管道包含零个或多个操作。
-
每个管道以操作结束。
-
哪种操作会产生另一个流作为其输出?
-
描述
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
是最适合使用的操作吗? -
是非题:聚合操作使使用非线程安全集合实现并行成为可能。
-
除非另有说明,否则流始终是 String 行的。您如何请求并行处理流?
Exercises
- 将以下增强的
for
语句编写为带有 lambda 表达式的管道。提示:使用filter
中间操作和forEach
终端操作。
for (Person p : roster) {
if (p.getGender() == Person.Sex.MALE) {
System.out.println(p.getName());
}
}
- 将以下代码转换为使用 lambda 表达式和聚合操作而不是嵌套的
for
循环的新实现。提示:构建一个按此 Sequences 调用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);
}});