文档

Java™教程
隐藏目录
问题和练习
跟踪:集合
课程:聚合操作

问题和练习:聚合操作

问题

  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.reduce还是Stream.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);
                               }});
    

检查答案。


上一页: 并行处理
下一页: 实现