问题和练习:聚合操作

原文: https://docs.oracle.com/javase/tutorial/collections/streams/QandE/questions.html

问题

  1. 一系列聚合操作称为 _
  2. 每个管道包含零个或多个 _ 操作。
  3. 每个管道以 _ 操作结束。
  4. 什么样的操作产生另一个流作为其输出?
  5. 描述forEach聚合操作与增强for语句或迭代器不同的一种方式。
  6. 对错:流类似于集合,因为它是存储元素的数据结构。
  7. 识别此代码中的中间和终端操作:

    1. double average = roster
    2. .stream()
    3. .filter(p -> p.getGender() == Person.Sex.MALE)
    4. .mapToInt(Person::getAge)
    5. .average()
    6. .getAsDouble();
  8. 代码p -> p.getGender() == Person.Sex.MALE是什么样的例子?

  9. 代码Person::getAge是什么样的例子?
  10. 组合流内容并返回一个值的终端操作被称为什么?
  11. 列举Stream.reduce方法和Stream.collect方法之间的一个重要区别。
  12. 如果要处理名称流,提取男性名称,并将它们存储在新的List中,Stream.reduceStream.collect是否最适合使用?
  13. 判断对错:聚合操作可以实现与非线程安全集合的并行性。
  14. 除非另有说明,否则流始终是串行的。您如何请求并行处理流?

演习

  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. }
  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. }});

检查你的答案。