摘要:只是思路,其性能并不一定高效,尤其是數(shù)據(jù)都在內(nèi)存中處理時(shí)復(fù)制的開(kāi)銷(xiāo)很大。方法將原始流中所有的數(shù)據(jù)添加到各個(gè)內(nèi),此處實(shí)現(xiàn)了復(fù)制此處重寫(xiě)了接口,只是簡(jiǎn)單的從中取出數(shù)據(jù),執(zhí)行。是中數(shù)據(jù)結(jié)束的標(biāo)示
正常情況下,一個(gè)流在執(zhí)行一次終端操作之后便結(jié)束了。本文通過(guò)復(fù)制流內(nèi)數(shù)據(jù)的方式,曲折的實(shí)現(xiàn)了同一個(gè)流上執(zhí)行多次操作。
Demo只是思路,其性能并不一定高效,尤其是數(shù)據(jù)都在內(nèi)存中處理時(shí)復(fù)制的開(kāi)銷(xiāo)很大。但如果流涉及大量I/O,也許性能會(huì)有提高。
public class StreamForker{ private final Stream stream; private final Map
accept方法將原始流中所有的數(shù)據(jù)添加到各個(gè)BlockingQueue內(nèi),此處實(shí)現(xiàn)了復(fù)制
class ForkingStreamConsumerimplements Consumer , Results { static final Object END_OF_STREAM = new Object(); private final List > queues; private final Map > actions; public ForkingStreamConsumer(List > queues, Map > actions) { this.queues = queues; this.actions = actions; } @Override public void accept(T t) { queues.forEach(q -> q.add(t)); } @SuppressWarnings("unchecked") void finish() { accept((T) END_OF_STREAM); } @SuppressWarnings("unchecked") @Override public R get(Object key) { try { return ((Future ) actions.get(key)).get(); } catch (Exception e) { throw new RuntimeException(e); } } }
此處重寫(xiě)了tryAdvance接口,只是簡(jiǎn)單的從BlockingQueue中取出數(shù)據(jù),執(zhí)行action。業(yè)務(wù)邏輯中復(fù)制流是為了做什么事情,action就是這件事情。ForkingStreamConsumer.END_OF_STREAM是Queue中數(shù)據(jù)結(jié)束的標(biāo)示
class BlockingQueueSpliteratorimplements Spliterator { private final BlockingQueue q; BlockingQueueSpliterator(BlockingQueue q) { this.q = q; } @Override public boolean tryAdvance(Consumer super T> action) { T t; while (true) { try { t = q.take(); break; } catch (InterruptedException e) { } } if (t != ForkingStreamConsumer.END_OF_STREAM) { action.accept(t); return true; } return false; } @Override public Spliterator trySplit() { return null; } @Override public long estimateSize() { return 0; } @Override public int characteristics() { return 0; } }
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/68084.html
摘要:需要注意的是很多流操作本身就會(huì)返回一個(gè)流,所以多個(gè)操作可以直接連接起來(lái),如下圖這樣,操作可以進(jìn)行鏈?zhǔn)秸{(diào)用,并且并行流還可以實(shí)現(xiàn)數(shù)據(jù)流并行處理操作。為集合創(chuàng)建并行流。 上一篇文章,小樂(lè)給大家介紹了《Java8新特性之方法引用》,下面接下來(lái)小樂(lè)將會(huì)給大家介紹Java8新特性之Stream,稱(chēng)之為流,本篇文章為上半部分。 1、什么是流? Java Se中對(duì)于流的操作有輸入輸出IO流,而Jav...
摘要:元素序列流也提供了一個(gè)接口,可以訪問(wèn)特定元素類(lèi)型的一組有序值。因?yàn)榧鲜菙?shù)據(jù)結(jié)構(gòu),所以它的主要目的是以特定的時(shí)間空間復(fù)雜度存儲(chǔ)和訪問(wèn)元素如與。請(qǐng)注意,從有序集合生成流時(shí)會(huì)保留原有的順序。由列表生成的流,其元素順序與列表一致。 流是什么 流是Java API的新成員,它允許你以聲明性方式處理數(shù)據(jù)集合(通過(guò)查詢語(yǔ)句來(lái)表達(dá),而不是臨時(shí)編寫(xiě)一個(gè)實(shí)現(xiàn))。可以把它們看成遍歷數(shù)據(jù)集的高級(jí)迭代器。此外...
摘要:內(nèi)部迭代與使用迭代器顯式迭代的集合不同,流的迭代操作是在背后進(jìn)行的。流只能遍歷一次請(qǐng)注意,和迭代器類(lèi)似,流只能遍歷一次。 流(Stream) 流是什么 流是Java API的新成員,它允許你以聲明性方式處理數(shù)據(jù)集合(通過(guò)查詢語(yǔ)句來(lái)表達(dá),而不是臨時(shí)編寫(xiě)一個(gè)實(shí)現(xiàn))。就現(xiàn)在來(lái)說(shuō),你可以把它們看成遍歷數(shù)據(jù)集的高級(jí)迭代器。此外,流還可以透明地并行處理,你無(wú)需寫(xiě)任何多線程代碼了!我會(huì)在后面的筆記中...
摘要:大家好,我是樂(lè)字節(jié)的小樂(lè)。需要注意的是很多流操作本身就會(huì)返回一個(gè)流,所以多個(gè)操作可以直接連接起來(lái),如下圖這樣,操作可以進(jìn)行鏈?zhǔn)秸{(diào)用,并且并行流還可以實(shí)現(xiàn)數(shù)據(jù)流并行處理操作。為集合創(chuàng)建并行流。 大家好,我是樂(lè)字節(jié)的小樂(lè)。說(shuō)起流,我們會(huì)聯(lián)想到手機(jī)、電腦組裝流水線,物流倉(cāng)庫(kù)商品包裝流水線等等,如果把手機(jī) ,電腦,包裹看做最終結(jié)果的話,那么加工商品前的各種零部件就可以看做數(shù)據(jù)源,而中間一系列的...
摘要:補(bǔ)充一點(diǎn)使用數(shù)值流可以避免計(jì)算過(guò)程中拆箱裝箱,提高性能。其目的主要是打開(kāi)流,做出某種程度的數(shù)據(jù)映射過(guò)濾,然后返回一個(gè)新的流,交給下一個(gè)操作使用。終端操作的執(zhí)行,才會(huì)真正開(kāi)始流的遍歷。 Java8的新特性主要是Lambda表達(dá)式和流,當(dāng)流和Lambda表達(dá)式結(jié)合起來(lái)一起使用時(shí),因?yàn)榱魃昝魇教幚頂?shù)據(jù)集合的特點(diǎn),可以讓代碼變得簡(jiǎn)...
閱讀 3011·2021-10-12 10:12
閱讀 3066·2021-09-22 16:04
閱讀 3297·2019-08-30 15:54
閱讀 2609·2019-08-29 16:59
閱讀 2921·2019-08-29 16:08
閱讀 874·2019-08-29 11:20
閱讀 3500·2019-08-28 18:08
閱讀 656·2019-08-26 13:43