摘要:串行與并行可以分為串行與并行兩種,串行流和并行流差別就是單線程和多線程的執(zhí)行。返回串行流返回并行流和方法返回的都是類型的對象,說明它們在功能的使用上是沒差別的。唯一的差別就是單線程和多線程的執(zhí)行。
Stream是什么
Stream是Java8中新加入的api,更準(zhǔn)確的說:
Java 8 中的 Stream 是對集合(Collection)對象功能的增強,它專注于對集合對象進(jìn)行各種非常便利、高效的聚合操作,或者大批量數(shù)據(jù)操作 。Stream API 借助于同樣新出現(xiàn)的 Lambda 表達(dá)式,極大的提高編程效率和程序可讀性.
以前我們處理復(fù)雜的數(shù)據(jù)只能通過各種for循環(huán),不僅不美觀,而且時間長了以后可能自己都看不太明白以前的代碼了,但有Stream以后,通過filter,map,limit等等方法就可以使代碼更加簡潔并且更加語義化。
流機器(動畫來自 Tagir Valeev)
Stream的效果就像上圖展示的它可以先把數(shù)據(jù)變成符合要求的樣子(map),吃掉不需要的東西(filter)然后得到需要的東西(collect)。
而關(guān)于如何使用,下面就用一個簡單的例子來說明。
Stream的使用下面是一個簡單的示例代碼
Listmenu = ... List lowCaloricDishesName = menu.stream() //篩選出卡路里大于400的 .filter(d -> d.getCalories() < 400) //抽取名字屬性創(chuàng)建一個新的流 .map(Dish::getName) //這個流按List類型返回 .collect(toList());
在這段代碼 filter 和 map 操作被稱為中間操作,中間操作會返回一個新的流,而 collect 則被稱為終端操作只有終端操作才會讓整個流執(zhí)行并關(guān)閉。也就是說 每個流只能遍歷一次 ,因為collect以后這個流就已經(jīng)關(guān)閉了。
Listtest = Arrays.asList("Java8", "In", "Action"); Stream s = title.stream(); s.forEach(System.out::println); s.forEach(System.out::println); // 代碼會拋出一個java.lang.IllegalStateException異常
想了解更多Stream的api可以查閱官方文檔。
串行與并行Stream可以分為串行與并行兩種,串行流和并行流差別就是單線程和多線程的執(zhí)行。
default Stream stream() : 返回串行流
default Stream parallelStream() : 返回并行流
stream()和parallelStream()方法返回的都是java.util.stream.Stream
記得以前正好看過一篇關(guān)于Stream的性能的文章,在此就直接引用結(jié)論了
結(jié)果可以總結(jié)如下:
1.對于簡單操作,比如最簡單的遍歷,Stream串行API性能明顯差于顯示迭代,但并行的Stream API能夠發(fā)揮多核特性。
2.對于復(fù)雜操作,Stream串行API性能可以和手動實現(xiàn)的效果匹敵,在并行執(zhí)行時Stream API效果遠(yuǎn)超手動實現(xiàn)。所以,如果出于性能考慮,1. 對于簡單操作推薦使用外部迭代手動實現(xiàn),2. 對于復(fù)雜操作,推薦使用Stream API, 3. 在多核情況下,推薦使用并行Stream API來發(fā)揮多核優(yōu)勢,4.單核情況下不建議使用并行Stream API。
如果出于代碼簡潔性考慮,使用Stream API能夠?qū)懗龈痰拇a。即使是從性能方面說,盡可能的使用Stream API也另外一個優(yōu)勢,那就是只要Java Stream類庫做了升級優(yōu)化,代碼不用做任何修改就能享受到升級帶來的好處。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/74183.html
摘要:需要注意的是很多流操作本身就會返回一個流,所以多個操作可以直接連接起來,如下圖這樣,操作可以進(jìn)行鏈?zhǔn)秸{(diào)用,并且并行流還可以實現(xiàn)數(shù)據(jù)流并行處理操作。為集合創(chuàng)建并行流。 上一篇文章,小樂給大家介紹了《Java8新特性之方法引用》,下面接下來小樂將會給大家介紹Java8新特性之Stream,稱之為流,本篇文章為上半部分。 1、什么是流? Java Se中對于流的操作有輸入輸出IO流,而Jav...
摘要:內(nèi)部迭代與使用迭代器顯式迭代的集合不同,流的迭代操作是在背后進(jìn)行的。流只能遍歷一次請注意,和迭代器類似,流只能遍歷一次。 流(Stream) 流是什么 流是Java API的新成員,它允許你以聲明性方式處理數(shù)據(jù)集合(通過查詢語句來表達(dá),而不是臨時編寫一個實現(xiàn))。就現(xiàn)在來說,你可以把它們看成遍歷數(shù)據(jù)集的高級迭代器。此外,流還可以透明地并行處理,你無需寫任何多線程代碼了!我會在后面的筆記中...
摘要:大家好,我是樂字節(jié)的小樂。需要注意的是很多流操作本身就會返回一個流,所以多個操作可以直接連接起來,如下圖這樣,操作可以進(jìn)行鏈?zhǔn)秸{(diào)用,并且并行流還可以實現(xiàn)數(shù)據(jù)流并行處理操作。為集合創(chuàng)建并行流。 大家好,我是樂字節(jié)的小樂。說起流,我們會聯(lián)想到手機、電腦組裝流水線,物流倉庫商品包裝流水線等等,如果把手機 ,電腦,包裹看做最終結(jié)果的話,那么加工商品前的各種零部件就可以看做數(shù)據(jù)源,而中間一系列的...
摘要:補充一點使用數(shù)值流可以避免計算過程中拆箱裝箱,提高性能。其目的主要是打開流,做出某種程度的數(shù)據(jù)映射過濾,然后返回一個新的流,交給下一個操作使用。終端操作的執(zhí)行,才會真正開始流的遍歷。 Java8的新特性主要是Lambda表達(dá)式和流,當(dāng)流和Lambda表達(dá)式結(jié)合起來一起使用時,因為流申明式處理數(shù)據(jù)集合的特點,可以讓代碼變得簡...
摘要:跳過元素流還支持方法,返回一個扔掉了前個元素的流。歸約到目前為止,我們見到過的終端操作都是返回一個之類的或?qū)ο蟮取_@樣的查詢可以被歸類為歸約操作將流歸約成一個值。通過反復(fù)使用加法,你把一個數(shù)字列表歸約成了一個數(shù)字。 使用流 在上一篇的讀書筆記中,我們已經(jīng)看到了流讓你從外部迭代轉(zhuǎn)向內(nèi)部迭代。這樣,你就用不著寫下面這樣的代碼來顯式地管理數(shù)據(jù)集合的迭代(外部迭代)了: /** * 菜單 ...
閱讀 2084·2023-04-25 21:11
閱讀 2972·2021-09-30 09:47
閱讀 2285·2021-09-24 09:48
閱讀 4446·2021-08-23 09:43
閱讀 905·2019-08-30 15:54
閱讀 571·2019-08-28 18:01
閱讀 1410·2019-08-27 10:55
閱讀 596·2019-08-27 10:55