Stream
是一系列的計算操作的合集,不是用于儲存數(shù)據(jù)的數(shù)據(jù)結(jié)果,使用目的在于將一系列數(shù)據(jù)轉(zhuǎn)化成目標(biāo)結(jié)果轧叽。
產(chǎn)生結(jié)果,并且不修改源數(shù)據(jù)對象刊棕。
對于Intermediate操作(各類型的計算操作)炭晒,只要不調(diào)用Terminal操作,流不會開始遍歷甥角。當(dāng)定義了多個Intermediate操作時网严,真正執(zhí)行時會有一個內(nèi)部轉(zhuǎn)換,僅遍歷一次完成所有的計算操作嗤无。
數(shù)據(jù)源可以是無限的震束,可通過操作將其轉(zhuǎn)化為有限的結(jié)果怜庸,比如limit(10)。
在一個流的生命周期內(nèi)垢村,源數(shù)據(jù)中的每個元素僅會被訪問一次割疾。
需要研究JDK代碼。
構(gòu)造流的方法
Collection的 stream() 和 parallelStream() 方法嘉栓。
Arrays.stream(Object[])
靜態(tài)工廠方法宏榕,比如 Stream.of(Object[]), IntStream.range(int, int), Stream.iterate(Object, UnaryOperator)
BufferedReader.lines()
Files
Random.ints()
其他(待研究)
操作類型
Intermediate
Intermediate操作總是返回一個新的流,并且不涉及任何實際操作侵佃。
分為有狀態(tài)與無狀態(tài)兩種麻昼。
無狀態(tài):例如 filter() 和 map(),不對任何后續(xù)元素產(chǎn)生影響馋辈,每個元素可獨立操作涌献。
有狀態(tài):例如 distinct() 和 sort(),處理元素時首有,需要參考已處理元素的狀態(tài)燕垃。有狀態(tài)的操作會需要遍歷所有元素才可得出結(jié)果(例如排序),也就是說井联,在并行處理模式下卜壕,部分元素會需要重復(fù)計算 或 需要一個緩存。
Terminal
遍歷元素并輸出一個結(jié)果烙常。一個流只能有一個Terminal操作轴捎,遍歷完成后,流被消耗完畢蚕脏,無法再次遍歷侦副。
特例:iterator() 和 spliterator() (待研究)
Short-Circuiting
Intermidiate:當(dāng)這個操作的對象是一個無限大的數(shù)據(jù)源時,這個操作會產(chǎn)生有限的結(jié)果驼鞭。
Terminal:當(dāng)這個操作的對象是一個無限大的數(shù)據(jù)源時秦驯,這個操作會在有限的時間內(nèi)完成。
并行
任何流都可以應(yīng)用并行操作挣棕。與單線程序列化操作不同的僅僅在于生成流的方法译隘。
不干涉(non-interference)
遍歷過程中,絕對不會修改原數(shù)據(jù)洛心。
Reduction Operation (fold)
輸入是一系列元素固耘,輸出是一個匯總的結(jié)果,例如 求和 或者 求最大值词身。
在parallelStream的模式下厅目,Reduction Operation也能正確執(zhí)行。它會在各子集中求出一個結(jié)果,然后匯總所有的子結(jié)果损敷,得出最終的值户辫。
<U> U reduce(U identity, // initial seed value for the reduction and a default result
BiFunction<U, ? super T, U> accumulator, // take partial result and the next element to produce a new partial result
BinaryOperator<U> combiner); // combine partial results to a final result
Mutable reduction
將一個集合整合為目標(biāo)集合。
<R> R collect(Supplier<R> supplier, // a function to construct new instances of the result container
BiConsumer<R, ? super T> accumulator, // incorporate an input element into a result container
BiConsumer<R, R> combiner); // a combining function to merge contents