什么是Streams
這個(gè)里面的我們說的Streams是java.util.Streams跟java.io 里面的streams是完全不同的概念项棠。Java 8中的Stream其實(shí)是函數(shù)式編程里Monad的概念(Monad就是一種設(shè)計(jì)模式,表示將一個(gè)運(yùn)算過程,通過函數(shù)拆解成互相連接的多個(gè)步驟化戳,有點(diǎn)鏈?zhǔn)讲僮鞯母杏X)戴已, 是對(duì)集合(Collection)對(duì)象功能的增強(qiáng),它專注于對(duì)集合對(duì)象進(jìn)行各種非常便利扳躬、高效的聚合操作脆诉,或者大批量數(shù)據(jù)操作 甚亭。同時(shí)它提供串行和并行兩種模式進(jìn)行匯聚操作,并發(fā)模式能夠充分利用多核處理器的優(yōu)勢击胜,使用 fork/join 并行方式來拆分任務(wù)和加速處理過程亏狰。所以說,Java 8 中首次出現(xiàn)的 java.util.stream 是一個(gè)函數(shù)式語言+多核時(shí)代綜合影響的產(chǎn)物偶摔。
Streams特性
- 不是數(shù)據(jù)結(jié)構(gòu)暇唾,沒有存儲(chǔ),它只是用操作管道從 source(數(shù)據(jù)結(jié)構(gòu)辰斋、數(shù)組策州、generator function、IO channel)抓取數(shù)據(jù)
- 不修改源數(shù)據(jù):它也絕不修改自己所封裝的底層數(shù)據(jù)結(jié)構(gòu)的數(shù)據(jù)亡呵。例如 Stream 的 filter 操作會(huì)產(chǎn)生一個(gè)不包含被過濾元素的新 Stream抽活,而不是從 source 刪除那些元素
- Stream的操作以Lambda表達(dá)式作為參數(shù)
- 不支持索引訪問,你可以請(qǐng)求第一個(gè)數(shù)據(jù)锰什,但是缺沒法訪問第二個(gè)下硕,第三個(gè)
- 很容易生成數(shù)組或者List
- 惰性化:所有的intermediate操作都是惰性的,就是說當(dāng)調(diào)用到這些方法的時(shí)候并沒有開始計(jì)算汁胆,只有調(diào)用到Terminal方法的時(shí)候梭姓,才會(huì)真正開始流的遍歷,并且會(huì)生成一個(gè)結(jié)果
- 可以是無限的嫩码。 Collection是有限的誉尖,但是streams可以是無限的,Short-circuiting操作比如 limit(n) 或者 findFirst()能允許計(jì)算無限的streams并在有限的時(shí)間內(nèi)得到結(jié)果
如何得到Streams:
- From a Collection via the stream() and parallelStream() methods
- From an array via Arrays.stream(Object[]);
- From static factory methods on the stream classes, such as Stream.of(Object[]), IntStream.range(int, int) or Stream.iterate(Object, UnaryOperator);
- The lines of a file can be obtained from BufferedReader.lines();
- Streams of file paths can be obtained from methods in Files;
- Streams of random numbers can be obtained from Random.ints();
- Numerous other stream-bearing methods in the JDK, including BitSet.stream(), Pattern.splitAsStream(java.lang.CharSequence), and JarFile.stream().
Intermediate 和 Terminal 操作
- Intermediate 操作: map (mapToInt, flatMap 等)铸题、 filter铡恕、 distinct、 sorted丢间、 peek探熔、 limit、 skip烘挫、 parallel诀艰、 sequential、 unordered
- Terminal 操作: forEach饮六、 forEachOrdered其垄、 toArray、 reduce卤橄、 collect绿满、 min、 max窟扑、 count棒口、 anyMatch寄月、 allMatch、 noneMatch无牵、 findFirst、 findAny厂抖、 iterator
- Short-circuiting 操作:anyMatch茎毁、 allMatch、 noneMatch忱辅、 findFirst七蜘、 findAny、 limit
PS:Short-circuiting 操作指:對(duì)于一個(gè) intermediate 操作墙懂,如果它接受的是一個(gè)無限大(infinite/unbounded)的 Stream橡卤,但返回一個(gè)有限的新 Stream。對(duì)于一個(gè) terminal 操作损搬,如果它接受的是一個(gè)無限大的 Stream碧库,但能在有限的時(shí)間計(jì)算出結(jié)果。
reference:
https://www.ibm.com/developerworks/cn/java/j-lo-java8streamapi/