Stream特性
1)不存储元素:元素通过Spliterator来遍历获取
2)不改变源对象:返回持有结果新的Stream
3)操作延迟执行:在需要结果的时候执行
Stream生命周期
Stream的生命周期:创建-->中间操作-->终端操作(终止操作)
1)创建
集合获取:Collection.stream()
数组创建:Arrays.stream(new String[2])
数值创建:Stream.of(1,2,3)
生成:Stream.generate(Supplier<T> s),属于无限流,需设定停止条件
迭代:Stream.iterate(final T seed, final UnaryOperator<T> f),属于无限流,需设定停止条件。UnaryOperator继承Function,输入和输出属同类型,输入是前一个的输出。
连接:Stream.concat(Stream<? extents T> a, Stream<? extents T> b),两个Stream连接一起生成新的Stream。
Stream也提供了Builder方式创建,如:Stream.builder().add(1).add(2).build()
2)中间操作
中间操作分为两大类:无状态操作(StatelessOp)、有状态操作(StatefulOp)
StatelessOp:filter\map\mapToInt\mapToLong\mapToDouble
\flatMap\flatMapToInt\flatMapToLong\flatMapToDouble\peek
StatefulOp:distinct\sorted\limit\skip
3)终端操作
终端操作有:ForEachOp、MatchOp、FindOp、ReduceOp和toArray\collect\count
ForEachOp:forEach\forEachOrdered
MatchOp:anyMatch\allMatch\noneMatch
FindOp:findFirst\findAny
ReduceOp:reduce\min\max
Stream执行
1) 顺序流
同步执行,在当前线程执行,不做线程转换