5.10 小结
以下是本章中的关键概念。
Stream API可以表达复杂的数据处理查询。常用的流操作总结在表5-1中。
- 你可以使用
filter、distinct、takeWhile(Java 9)、dropWhile(Java 9)、skip和limit对流做筛选和切片。 - 如果你明确地知道数据源是排序的,那么用
takeWhile和dropWhile方法通常比filter高效得多。 - 你可以使用
map和flatMap提取或转换流中的元素。 - 你可以使用
findFirst和findAny方法查找流中的元素。你可以用allMatch、noneMatch和anyMatch方法让流匹配给定的谓词。 - 这些方法都利用了短路:找到结果就立即停止计算;没有必要处理整个流。
- 你可以利用
reduce方法将流中所有的元素迭代合并成一个结果,例如求和或查找最大元素。 filter和map等操作是无状态的,它们并不存储任何状态。reduce等操作要存储状态才能计算出一个值。sorted和distinct等操作也要存储状态,因为它们需要把流中的所有元素缓存起来才能返回一个新的流。这种操作称为有状态操作。- 流有三种基本的原始类型特化:
IntStream、DoubleStream和LongStream。它们的操作也有相应的特化。 - 流不仅可以从集合创建,也可从值、数组、文件以及
iterate与generate等特定方法创建。 - 无限流所包含的元素数量是无限的(想象一下所有可能的字符串构成的流)。这种情况是有可能的,因为流中的元素大多数都是即时产生的。使用
limit方法,你可以由一个无限流创建一个有限流。
