8.1 简介
Java8新增了Stream、IntStream、LongStream、DoubleStream等流式API,这些API代表多个支持串行和并行聚集操作的元素。
使用Stream流的步骤如下:
- 使用Stream或XxxStream的builder()类方法创建该Stream对应的Builder。
- 重复调用Builder的add()方法向该流中添加多个元素。
- 调用Builder的build()方法获取对应的Stream。
- 调用Stream的聚集方法。
8.2 聚集方法与分类
Stream的聚集方法分为两类:
- 中间方法:中间操作允许流保持打开状态,并允许直接调用后续方法。中间方法的返回值是另一个流,不会影响原有流中的数据。
- 末端方法:末端方法是对流的最终操作。执行末端方法后,流将会被消耗且不再可用。
流的方法有如下两个特征:
- 有状态的方法:这种方法会给流增加一些新的属性,比如元素的唯一性、元素的最大数量、对元素进行排序。有状态的方法往往需要更大的性能开销。
- 短路方法:尽早结束对流的操作,不必检查所有的元素。
Stream常用的中间方法:
- filter(Predicate predicate):过滤Stream中所有不符合predicate的元素。
- mapToXxx(ToXxxFunction mapper):使用ToXxxFunction对流中的元素执行一对一的转换,该方法返回的新流中包含了ToXxxFunction转换生成的所有元素。
- peek(Consumer action):依次对流进行一些操作,此方法返回的流与原有流包含相同的元素。此方法主要用于调试。
- distinct():此方法用于排序流中所有重复的元素,此方法为有状态方法。
- sorted():对流进行排序,此方法为有状态方法。
- limit(long maxSize):限制流中的元素个数,此方法为有状态的、短路的方法。
Stream常用的末端方法:
- forEach(Consumer action):遍历流中所有元素。
- toArray():将流中所有元素转换为数组。
- reduce():合并流中的元素。
- min():返回流中所有元素的最小值。
- max():返回流中所有元素的最大值。
- count():返回流中所有元素的数量。
- anyMatch(Predicate predicate):流中是否至少包含一个符合特定条件的元素。
- allMatch(Predicate predicate):流中是否至少每个元素都符合特定条件。
- noneMatch(Predicate predicate):流中是否所有元素都不符合特定条件。
- findFirst():返回流中的第一个元素。
- findAny():返回流中任意一个元素。
网友评论