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