流操作

207 阅读1分钟

java.util.stream.Stream中的Stream接口定义了许多操作。它们可以分为两大类。

我们再来看一下前面的例子:

List<String> names = menu.stream()// 从菜单获得流
    .filter(d -> d.getCalories() > 300)// 中间操作
    .map(Dish::getName)// 中间操作
    .limit(3)// 中间操作
    .collect(toList);// 将Stream转换为List

你可以看到两类操作:

  • filter、map和limit可以练成一条流水线;
  • collect触发流水线执行并关闭它。

可以连接起来的操作称为中间操作,关闭流的操作称为终端操作

中间操作:诸如filter或sorted等中间操作会返回另一个流。这让多个操作可以连接起来成为一个查询。重要的是,除非流水线上触发一个终端操作,否则中间操作不会执行任何处理--它们很懒。这是因为中间操作一般都可以合并起来,再终端操作时一次性全部处理。

终端操作:终端操作会从流水线生成结果。其结果时任何不是流的值,比如List、Integer,甚至void。

总而言之,流的使用一般包括三件事:

  • 一个数据源(如集合)来执行一个查询;
  • 一个中间操作链,形成一条流的流水线;
  • 一个终端操作,执行流水线,并能生成结果。

流的流水线背后的理念类似于构建器模式。在构建器模式中有一个调用链用来设置一套配置(对流来说这就是一个中间操作链),接着是调用built方法(对流来说就是终端操作)。