查询stream流的特征
stream流的特征
Stream API 依赖于一个特殊的对象,即 Spliterator
接口的一个实例。Spliterator
在Stream API中的角色类似于Iterator
在Collection API中的角色。此外,由于 Stream API 支持并行处理,Spliterator
对象还控制stream流如何在处理并行化的不同 CPU 之间拆分其元素。
The name is the contraction of split and iterator.
Spliterator
对象带有流的特性。这些特性不是您经常使用的,但知道它们是什么将帮助您在某些情况下编写更好、更高效的pipeline管道。
stream流的特征如下
特征 | 说明 |
---|---|
Spliterator.ORDERED | stream流中元素的处理顺序很重要 |
Spliterator.DISTINCT | stream流中没有重复的元素 |
Spliterator.NONNULL | stream流中没有null 元素 |
Spliterator.SORTED | stream流中的元素已排序 |
Spliterator.SIZED | stream流中的元素个数已知 |
Spliterator.SUBSIZED | 拆分stream流会得到2个SIZED stream流 |
Spliterator.IMMUTABLE | 元素源不可变 |
Spliterator.CONCURRENT | 元素源可以由多个线程安全的同时修改 |
每个stream流的创建都会设置或取消设置这些特征。
记住stream流可以由以下2种方式创建:
-
从数据源创建stream流
-
每次在stream流中使用中间操作也会创建新的stream流
ORDERED
stream流
ORDERED
streams are created with ordered sources of data.
unordered()
可以删除stream流的ORDERED
特征。
Keeping track of the order of the elements of a stream may lead to overheads for parallel streams.
Keeping a stream
ORDERED
may be costly in some cases, for instance when you are using parallel streams.
SORTED
stream流
A
SORTED
stream is a stream that has been sorted.
中间操作可能清除stream流的SORTED
特征。
Collection<String> stringCollection = List.of("one", "two", "two", "three", "four", "five");
Stream<String> strings = stringCollection.stream().sorted(); // SORTED Stream
Stream<String> filteredStrings = strings.filtered(s -> s.length() < 5); // SORTED Stream
Stream<Integer> lengths = filteredStrings.map(String::length); // not SORTED Stream
DISTINCT
stream流
A
DISTINCT
stream is a stream with no duplicates among the elements it is processing.
例如从HashSet
创建的stream流,或调用distinct()
中间操作
使用过滤时保留特征,但映射或者flatMap()
会丢失特征。
Collection<String> stringCollection = List.of("one", "two", "two", "three", "four", "five");
Stream<String> strings = stringCollection.stream().distinct(); // DISTINCT
Stream<String> filteredStrings = strings.filtered(s -> s.length() < 5); // DISTINCT
Stream<Integer> lengths = filteredStrings.map(String::length); // not DISTINCT
NONNULL
stream流
A
NONNULL
stream is a stream that does not contain null values.
映射同样会丢失特征。
SIZED
和SUBSIZED
stream流
映射会保留特征,但flatMap()
, 过滤和distinct()
会擦除特征。
It is always better to have
SIZED
andSUBSIZED
stream for parallel computations.