第 5 章 使用流

本章内容

  • 筛选、切片和映射
  • 查找、匹配和归约
  • 使用数值范围等数值流
  • 从多个源创建流
  • 无限流

在上一章中你已看到了,流让你从外部迭代转向内部迭代。这样,你就用不着写下面这样的代码来显式地管理数据集合的迭代(外部迭代)了:

  1. List<Dish> vegetarianDishes = new ArrayList<>();
  2. for(Dish d: menu){
  3. if(d.isVegetarian()){
  4. vegetarianDishes.add(d);
  5. }
  6. }

你可以使用支持filtercollect操作的Stream API管理集合数据的迭代(内部迭代)。你只需要将筛选行为作为参数传递给filter方法就行了。

  1. import static java.util.stream.Collectors.toList;
  2. List<Dish> vegetarianDishes =
  3. menu.stream()
  4. .filter(Dish::isVegetarian)
  5. .collect(toList());

这种处理数据的方式很有用,因为你让Stream API管理如何处理数据。这样Stream API就可以在背后进行多种优化。此外,使用内部迭代的话,Stream API可以决定并行运行你的代码。这要是用外部迭代的话就办不到了,因为你只能用单一线程挨个迭代。

通过本章,你能全面地了解Stream API支持的各种操作。我们会学习Java 8中Stream已经支持的操作和Java 9中Stream新增的操作。这些操作能帮助你实现复杂的数据查询,如筛选、切片、映射、查找、匹配和归约。接着,我们会了解一些比较特殊的流:数值流、由多个来源(譬如文件和数组)构成的流,以及无限流。