5.10 小结

以下是本章中的关键概念。

Stream API可以表达复杂的数据处理查询。常用的流操作总结在表5-1中。

  • 你可以使用filterdistincttakeWhile (Java 9)、dropWhile (Java 9)、skiplimit对流做筛选和切片。
  • 如果你明确地知道数据源是排序的,那么用takeWhiledropWhile方法通常比filter高效得多。
  • 你可以使用mapflatMap提取或转换流中的元素。
  • 你可以使用findFirstfindAny方法查找流中的元素。你可以用allMatchnoneMatchanyMatch方法让流匹配给定的谓词。
  • 这些方法都利用了短路:找到结果就立即停止计算;没有必要处理整个流。
  • 你可以利用reduce方法将流中所有的元素迭代合并成一个结果,例如求和或查找最大元素。
  • filtermap等操作是无状态的,它们并不存储任何状态。reduce等操作要存储状态才能计算出一个值。sorteddistinct等操作也要存储状态,因为它们需要把流中的所有元素缓存起来才能返回一个新的流。这种操作称为有状态操作。
  • 流有三种基本的原始类型特化:IntStreamDoubleStreamLongStream。它们的操作也有相应的特化。
  • 流不仅可以从集合创建,也可从值、数组、文件以及iterategenerate等特定方法创建。
  • 无限流所包含的元素数量是无限的(想象一下所有可能的字符串构成的流)。这种情况是有可能的,因为流中的元素大多数都是即时产生的。使用limit方法,你可以由一个无限流创建一个有限流。