官术网_书友最值得收藏!

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()

產生當前集合中所有元素的順序流或并行流。

主站蜘蛛池模板: 宾川县| 天台县| 大竹县| 邵武市| 阳朔县| 华坪县| 页游| 嘉荫县| 庆城县| 丰原市| 彭泽县| 樟树市| 漳浦县| 嵊泗县| 兰西县| 澄迈县| 青龙| 金塔县| 普格县| 咸丰县| 泰宁县| 临江市| 平乡县| 塘沽区| 镇巴县| 沈丘县| 咸宁市| 金寨县| 彭阳县| 陇西县| 福安市| 潞城市| 麦盖提县| 张家界市| 新乡县| 且末县| 长海县| 香格里拉县| 花垣县| 临桂县| 凌云县|