文档

Java™ 教程-Java Tutorials 中文版
问题和练习
Trail: Collections
Lesson: Aggregate Operations

问题和练习:聚合操作

问题

  1. 一系列聚合操作称为___。
  2. 每个管道包含零个或多个___操作。
  3. 每个管道以___操作结束。
  4. 什么样的操作产生另一个流作为其输出?
  5. 描述 forEach 聚合操作与增强的 for 语句或迭代器的不同之处。
  6. 对或错:流类似于集合,因为它是存储元素的数据结构。
  7. 在此代码中标识中间和终端操作:
    double average = roster
        .stream()
        .filter(p -> p.getGender() == Person.Sex.MALE)
        .mapToInt(Person::getAge)
        .average()
        .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 终端操作。
    for (Person p : roster) {
        if (p.getGender() == Person.Sex.MALE) {
            System.out.println(p.getName());
        }
    }
    
  2. 将以下代码转换为使用 lambda 表达式和聚合操作的新实现,而不是嵌套 for 循环。提示:按顺序调用 filtersortedcollect 操作的管道。
    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);
                               }});
    

检查一下你的答案。


Previous page: Parallelism
Next page: Implementations