问题

1.问:一系列聚合运算称为
答:管道
2.问:每个管道包含零个或多个
操作。
答:中间
3.问:每个管道都以_操作结束。
A:终端
4.问:哪种操作会产生另一个流作为其输出?
答:中间
5.问:描述forEach聚合操作与增强型for语句或迭代器方式的不同。
答:forEach聚合操作让系统决定迭代的“方式”。使用聚合操作可以使您专注于“什么”而不是“如何”。
6.问:是非题:流类似于集合,因为它是一种存储元素的数据结构。
答:错。与集合不同,流不是数据结构。相反,它通过管道携带来自源的值。
7.问:在此代码中标识中间和终端操作:

  1. double average = roster
  2. .stream()
  3. .filter(p -> p.getGender() == Person.Sex.MALE)
  4. .mapToInt(Person::getAge)
  5. .average()
  6. .getAsDouble();

A:中间:filtermapToInt
终端: average
终端操作average返回OptionalDouble。然后在该返回的对象上调用getAsDouble方法。咨询API规范以获取有关操作是中间操作还是终端操作的信息,始终是一个好主意 。
8.问:代码 p -> p.getGender() == Person.Sex.MALE是什么示例?
答:lambda表达式。
9.问:代码 Person::getAge是什么示例?
答:方法引用。
10.问:组合流内容并返回一个值的终端操作称为什么?
答:归约操作。
11.问:请列出Stream.reduce方法与Stream.collect方法之间的一个重要区别。
答:Stream.reduce在处理元素时总是创建一个新值。 Stream.collect修改(或变异)现有值。
12.问:如果你想处理的名称的流,提取男性名字,并将其存储在一个新的ListStream.reduce或者 Stream.collect是最合适使用的操作?
答:collect操作最适合收集到List中。

例:

  1. List<String> namesOfMaleMembersCollect = roster
  2. .stream()
  3. .filter(p -> p.getGender() == Person.Sex.MALE)
  4. .map(p -> p.getName())
  5. .collect(Collectors.toList());

13.问:是非题:聚合操作使使用非线程安全集合实现并行成为可能。
答:是的,前提是您在操作基础集合时不对其进行修改(变异)。
14.问:除非另有说明,否则流始终是串行的。您如何请求并行处理流?
答:通过调用parallelStream()而不是stream(),获取并行流。

练习

1.练习:将以下增强型for语句编写为带有lambda表达式的管道。提示:使用 filter中间操作和forEach终端操作。

  1. for (Person p : roster) {
  2. if (p.getGender() == Person.Sex.MALE) {
  3. System.out.println(p.getName());
  4. }
  5. }

回答:

  1. roster
  2. .stream()
  3. .filter(e -> e.getGender() == Person.Sex.MALE)
  4. .forEach(e -> System.out.println(e.getName());

2.将以下代码转换为使用lambda表达式和聚合操作,而不是嵌套for循环的新实现 。提示:按照这个顺序,使用管道调用filtersortedcollect 操作。

  1. List<Album> favs = new ArrayList<>();
  2. for (Album a : albums) {
  3. boolean hasFavorite = false;
  4. for (Track t : a.tracks) {
  5. if (t.rating >= 4) {
  6. hasFavorite = true;
  7. break;
  8. }
  9. }
  10. if (hasFavorite)
  11. favs.add(a);
  12. }
  13. Collections.sort(favs, new Comparator<Album>() {
  14. public int compare(Album a1, Album a2) {
  15. return a1.name.compareTo(a2.name);
  16. }});

回答:

  1. List<Album> sortedFavs =
  2. albums.stream()
  3. .filter(a -> a.tracks.anyMatch(t -> (t.rating >= 4)))
  4. .sorted(Comparator.comparing(a -> a.name))
  5. .collect(Collectors.toList());

在这里,我们使用流操作简化了三个主要步骤中的每个步骤-识别专辑中的任何曲目是否具有至少4(anyMatch)评分,排序以及符合我们条件的专辑收集到ListComparator.comparing()方法采用一个提取Comparable排序键的函数,并返回与该键进行比较的Comparator