- Java核心技術·卷Ⅱ:高級特性(原書第10版)
- (美)凱S.霍斯特曼
- 953字
- 2020-10-30 18:10:32
1.1 從迭代到流的操作
在處理集合時,我們通常會迭代遍歷它的元素,并在每個元素上執行某項操作。例如,假設我們想要對某本書中的所有長單詞進行計數。首先,將所有單詞放到一個列表中:

流的版本比循環版本要更易于閱讀,因為我們不必掃描整個代碼去查找過濾和計數操作,方法名就可以直接告訴我們其代碼意欲何為。而且,循環需要非常詳細地指定操作的順序,而流卻能夠以其想要的任何方式來調度這些操作,只要結果是正確的即可。
僅將stream修改為parallelStream就可以讓流庫以并行方式來執行過濾和計數。

流遵循了“做什么而非怎么做”的原則。在流的示例中,我們描述了需要做什么:獲取長單詞,并對它們計數。我們沒有指定該操作應該以什么順序或者在哪個線程中執行。相比之下,本節開頭處的循環要確切地指定計算應該如何工作,因此也就喪失了進行優化的機會。
流表面上看起來和集合很類似,都可以讓我們轉換和獲取數據。但是,它們之間存在著顯著的差異:
1.流并不存儲其元素。這些元素可能存儲在底層的集合中,或者是按需生成的。
2.流的操作不會修改其數據源。例如,filter方法不會從新的流中移除元素,而是會生成一個新的流,其中不包含被過濾掉的元素。
3.流的操作是盡可能惰性執行的。這意味著直至需要其結果時,操作才會執行。例如,如果我們只想查找前5個長單詞而不是所有長單詞,那么filter方法就會在匹配到第5個單詞后停止過濾。因此,我們甚至可以操作無限流。
讓我們再來看看這個示例。stream和parallelStream方法會產生一個用于words列表的stream。filter方法會返回另一個流,其中只包含長度大于12的單詞。count方法會將這個流化簡為一個結果。
這個工作流是操作流時的典型流程。我們建立了一個包含三個階段的操作管道:
1.創建一個流。
2.指定將初始流轉換為其他流的中間操作,可能包含多個步驟。
3.應用終止操作,從而產生結果。這個操作會強制執行之前的惰性操作。從此之后,這個流就再也不能用了。
在程序清單1-1中的示例中,流是用stream或parallelStream方法創建的。filter方法對其進行轉換,而count方法是終止操作。
程序清單1-1 streams/CountLongWords.java


在下一節中,你將會看到如何創建流。后續的三個小節將處理流的轉換。再后面的五個小節將討論終止操作。
java.util.stream.Stream<T>8
·Stream<T> filter(Predicate<? super T> p)
產生一個流,其中包含當前流中滿足P的所有元素。
·long count()
產生當前流中元素的數量。這是一個終止操作。
java.util.Collection<E>1.2
·default Stream<E> stream()
·default Stream<E> parallelStream()
產生當前集合中所有元素的順序流或并行流。
- 高手是如何做產品設計的(全2冊)
- 新一代通用視頻編碼H.266/VVC:原理、標準與實現
- iOS 9 Game Development Essentials
- Practical DevOps
- 程序員修煉之道:通向務實的最高境界(第2版)
- Hands-On Reinforcement Learning with Python
- 學習OpenCV 4:基于Python的算法實戰
- 用戶體驗可視化指南
- C++反匯編與逆向分析技術揭秘(第2版)
- Python入門很輕松(微課超值版)
- 超簡單:用Python讓Excel飛起來(實戰150例)
- Implementing Microsoft Dynamics NAV(Third Edition)
- 微信小程序開發圖解案例教程:附精講視頻(第3版)
- TensorFlow+Keras深度學習算法原理與編程實戰
- 米思齊實戰手冊:Arduino圖形化編程指南