Stream是 Java 8新增加的类,用来补充集合类。
Stream代表数据流,流中的数据元素的数量可能是有限的,也可能是无限的。
Stream和其它集合类的区别在于:其它集合类主要关注与有限数量的数据的访问和有效管理(增删改),而Stream并没有提供访问和管理元素的方式,而是通过声明数据源的方式,利用可计算的操作在数据源上执行,当然
BaseStream.iterator()
和
BaseStream.spliterator()
操作提供了遍历元素的方法。
Java Stream提供了提供了串行和并行两种类型的流,保持一致的接口,提供函数式编程方式,以管道方式提供中间操作和最终执行操作,为Java语言的集合提供了现代语言提供的类似的高阶函数操作,简化和提高了Java集合的功能。
本文首先介绍Java Stream的特点,然后按照功能分类逐个介绍流的中间操作和终点操作,最后会介绍第三方为Java Stream做的扩展。
Java8 Stream Javadoc
,并对流的这些特性做了进一步的解释。
Stream接口还包含几个基本类型的子接口如
IntStream
,
LongStream
和
DoubleStream
。
关于流和其它集合具体的区别,可以参照下面的列表:
不存储数据。流是基于数据源的对象,它本身不存储数据元素,而是通过管道将数据源的元素传递给操作。
函数式编程。流的操作不会修改数据源,例如filter不会将数据源中的数据删除。
延迟操作。流的很多操作如filter,map等中间操作是延迟执行的,只有到终点操作才会将操作顺序执行。
可以解绑。对于无限数量的流,有些操作是可以在有限的时间完成的,比如limit(n) 或 findFirst(),这些操作可是实现”短路”(Short-circuiting),访问到有限的元素后就可以返回。
纯消费。流的元素只能访问一次,类似Iterator,操作没有回头路,如果你想从头重新访问流的元素,对不起,你得重新生成一个新的流。
流的操作是以管道的方式串起来的。流管道包含一个数据源,接着包含零到N个中间操作,最后以一个终点操作结束。
public boolean allMatch (Predicate<? super T> predicate) public boolean anyMatch (Predicate<? super T> predicate) public boolean noneMatch (Predicate<? super T> predicate)
<R,A> R collect (Collector<? super T,A,R> collector) <R> R collect (Supplier<R> supplier, BiConsumer<R,? super T> accumulator, BiConsumer<R,R> combiner)
protonpack
项目提供了下列方法:
takeWhile and takeUntil
skipWhile and skipUntil
zip and zipWithIndex
unfold
MapStream
aggregate
Streamable
unique collector
java8-utils
也提供了一些有益的辅助方法。
https://docs.oracle.com/javase/8/docs/api/java/util/stream/package-summary.html
http://www.leveluplunch.com/java/examples/
https://github.com/poetix/protonpack
https://github.com/NitorCreations/java8-utils