@1234567890
2017-05-22T13:23:06.000000Z
字数 2048
阅读 1452
java8
java8流式处理,当成一个高级版本的Iterator。原始版本的Iterator,用户只能一个一个的遍历元素并对其执行某些操作;高级版本的Stream,用户只要给出需要对其包含的元素执行什么操作,比如“过滤掉长度大于10的字符串”、“获取每个字符串的首字母”等,具体这些操作如何应用到每个元素上,就给Stream就好了!
users.stream().filter(u -> u.getAge()>10).map(User::getName).collect(Collectors.toList());
java8通过内部迭代来实现对流的处理,一个流式处理可以分为三个部分:转换成流、中间操作、终端操作。如下图:
方法 | 描述 |
---|---|
Collection.stream() | 使用一个集合的元素创建一个流。 |
Stream.of(T...) | 使用传递给工厂方法的参数创建一个流。 |
Stream.of(T[]) | 使用一个数组的元素创建一个流。 |
Stream.empty() | 创建一个空流。 |
Stream.iterate(T first, BinaryOperator f) | 创建一个包含序列 |
Stream.iterate(T first, Predicate test, BinaryOperator f) | (仅限 Java 9)类似于 Stream.iterate(T first, BinaryOperator f),但流在测试预期返回 false 的第一个元素上终止。 |
Stream.generate(Supplier f) | 使用一个生成器函数创建一个无限流。 |
IntStream.range(lower, upper) | 创建一个由下限到上限(不含)之间的元素组成的 IntStream。 |
IntStream.rangeClosed(lower, upper) | 创建一个由下限到上限(含)之间的元素组成的 IntStream。 |
BufferedReader.lines() | 创建一个有来自 BufferedReader 的行组成的流。 |
BitSet.stream() | 创建一个由 BitSet 中的设置位的索引组成的 IntStream。 |
Stream.chars() | 创建一个与 String 中的字符对应的 IntStream。 |
中间操作负责将一个流转换为另一个流,中间操作包括 filter()(选择与条件匹配的元素)、map()(根据函数来转换元素)、distinct()(删除重复)、limit()(在特定大小处截断流)和 sorted()一些操作(比如 mapToInt())获取一种类型的流并返回一种不同类型的流;清单 1 中的示例的开头处有一个 Stream,它随后被转换为 IntStream。表 2 给出了一些中间流操作。
操作 | 内容 |
---|---|
filter(Predicate) | 与预期匹配的流的元素 |
map(Function) | 将提供的函数应用于流的元素的结果 |
flatMap(Function> | 将提供的流处理函数应用于流元素后获得的流元素 |
distinct() | 已删除了重复的流元素 |
sorted() | 按自然顺序排序的流元素 |
Sorted(Comparator) | 按提供的比较符排序的流元素 |
limit(long) | 截断至所提供长度的流元素 |
skip(long) | 丢弃了前 N 个元素的流元素 |
takeWhile(Predicate) | (仅限 Java 9)在第一个提供的预期不是 true 的元素处阶段的流元素 |
dropWhile(Predicate) | (仅限 Java 9)丢弃了所提供的预期为 true 的初始元素分段的流元素 |
中间操作始终是惰性的:调用中间操作只会设置流管道的下一个阶段,不会启动任何操作。重建操作可进一步划分为无状态 和有状态 操作。无状态操作(比如 filter() 或 map())可独立处理每个元素,而有状态操作(比如 sorted() 或 distinct())可合并以前看到的影响其他元素处理的元素状态。
数据集的处理在执行终止操作时开始,比如缩减(sum() 或 max())、应用 |(forEach()) 或搜索 (findFirst()) 操作。终止操作会生成一个结果或副作用。执行终止操作时,会终止流管道,如果您想再次遍历同一个数据集,可以设置一个新的流管道。表 3 给出了一些终止流操作。
操作 | 描述 |
---|---|
forEach(Consumer action) | 将提供的操作应用于流的每个元素。 |
toArray() | 使用流的元素创建一个数组。 |
reduce(...) | 将流的元素聚合为一个汇总值。 |
collect(...) | 将流的元素聚合到一个汇总结果容器中。 |
min(Comparator) | 通过比较符返回流的最小元素。 |
max(Comparator) | 通过比较符返回流的最大元素。 |
count() | 返回流的大小。 |
{any,all,none}Match(Predicate) | 返回流的任何/所有元素是否与提供的预期相匹配。 |
findFirst() | 返回流的第一个元素(如果有)。 |
findAny() | 返回流的任何元素(如果有)。 |