国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專(zhuān)欄INFORMATION COLUMN

Java8流的復(fù)制

smartlion / 1888人閱讀

摘要:只是思路,其性能并不一定高效,尤其是數(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, ?>> forks = new HashMap<>();

    public StreamForker(Stream stream) {
        this.stream = stream;
    }

    public StreamForker fork(Object key, Function, ?> f) {
        forks.put(key, f);
        return this;
    }

    public Results getResults() {
        ForkingStreamConsumer consumer = build();
        try {
            stream.sequential().forEach(consumer);
        } finally {
            consumer.finish();
        }
        return consumer;
    }

    private ForkingStreamConsumer build() {
        List> queues = new ArrayList<>();

        Map> actions = forks.entrySet().stream().reduce(new HashMap>(),
                (map, e) -> {
                    map.put(e.getKey(), getOperationResult(queues, e.getValue()));
                    return map;
                }, (m1, m2) -> {
                    m1.putAll(m2);
                    return m1;
                });

        return new ForkingStreamConsumer<>(queues, actions);
    }

    private Future getOperationResult(List> queues, Function, ?> f) {
        BlockingQueue queue = new LinkedBlockingQueue<>();
        queues.add(queue);
        Spliterator spliterator = new BlockingQueueSpliterator<>(queue);
        Stream source = StreamSupport.stream(spliterator, false);
        return CompletableFuture.supplyAsync(() -> f.apply(source));
    }
}

accept方法將原始流中所有的數(shù)據(jù)添加到各個(gè)BlockingQueue內(nèi),此處實(shí)現(xiàn)了復(fù)制

class ForkingStreamConsumer implements 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 BlockingQueueSpliterator implements Spliterator {
    private final BlockingQueue q;

    BlockingQueueSpliterator(BlockingQueue q) {
        this.q = q;
    }

    @Override
    public boolean tryAdvance(Consumer 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

相關(guān)文章

  • 樂(lè)字節(jié)-Java8新特性之Stream流(上)

    摘要:需要注意的是很多流操作本身就會(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...

    dingda 評(píng)論0 收藏0
  • Java8特性②Stream簡(jiǎn)介

    摘要:元素序列流也提供了一個(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í)迭代器。此外...

    EasonTyler 評(píng)論0 收藏0
  • Java8實(shí)戰(zhàn)》-第四章讀書(shū)筆記(引入流Stream)

    摘要:內(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ì)在后面的筆記中...

    _ivan 評(píng)論0 收藏0
  • 樂(lè)字節(jié)-Java8核心特性實(shí)戰(zhàn)之Stream(流)

    摘要:大家好,我是樂(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ù)源,而中間一系列的...

    wenshi11019 評(píng)論0 收藏0
  • 用Java 8 的 Stream 來(lái)寫(xiě)代碼,干凈優(yōu)雅!

    摘要:補(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)...

    wemall 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<