第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Spliterator Java 8 - 自定義實現(xiàn)

Spliterator Java 8 - 自定義實現(xiàn)

拉風(fēng)的咖菲貓 2021-12-10 10:18:28
我正在學(xué)習(xí)這個 Java 8 特性,我真的發(fā)現(xiàn)很難理解Spliterator接口的trySplit()方法實現(xiàn),如果自定義類用于并行處理生成的Stream.任何人都可以用一個清晰的例子來幫助我提供一些好的教程嗎?
查看完整描述

2 回答

?
有只小跳蛙

TA貢獻(xiàn)1824條經(jīng)驗 獲得超8個贊

理想的 trySplit 方法有效地(無需遍歷)將其元素精確地一分為二,從而實現(xiàn)平衡的并行計算。許多偏離這一理想的方法仍然非常有效;例如,僅對近似平衡的樹進(jìn)行近似分裂,或者對于葉子節(jié)點可能包含一個或兩個元素的樹,未能進(jìn)一步分裂這些節(jié)點。然而,平衡的大偏差和/或過度低效的 trySplit 機制通常會導(dǎo)致并行性能不佳。


以及帶有注釋的方法結(jié)構(gòu)


 public Spliterator<T> trySplit() {

   int lo = origin; // divide range in half

   int mid = ((lo + fence) >>> 1) & ~1; // force midpoint to be even

   if (lo < mid) { // split out left half

     origin = mid; // reset this Spliterator's origin

     return new TaggedArraySpliterator<>(array, lo, mid);

   }

   else       // too small to split

     return null;

 }

更多信息請閱讀https://docs.oracle.com/javase/8/docs/api/java/util/Spliterator.html


查看完整回答
反對 回復(fù) 2021-12-10
?
白衣染霜花

TA貢獻(xiàn)1796條經(jīng)驗 獲得超10個贊

這是實現(xiàn) Spliterator 的示例。


public class Payment {

    private String category;

    private double amount;


    public Payment(double amount, String category) {

        this.amount = amount;

        this.category = category;

    }


    public String getCategory() {

        return category;

    }


    public double getAmount() {

        return amount;

    }

}

TrySplit 實現(xiàn):


import java.util.List;

import java.util.Spliterator;

import java.util.function.Consumer;


public class PaymentBatchSpliterator implements Spliterator<Payment> {


    private List<Payment> paymentList;

    private int current;

    private int last;  // inclusive


    public PaymentBatchSpliterator(List<Payment> payments) {

        this.paymentList = payments;

        last = paymentList.size() - 1;

    }


    public PaymentBatchSpliterator(List<Payment> payments, int start, int last) {

        this.paymentList = payments;

        this.current = start;

        this.last = last;

    }


    @Override

    public boolean tryAdvance(Consumer<? super Payment> action) {

        if (current <= last) {

            action.accept(paymentList.get(current));

            current++;

            return true;

        }

        return false;

    }


    @Override

    public Spliterator<Payment> trySplit() {

        if ((last - current) < 100) {

            return null;

        }


        // first stab at finding a split position

        int splitPosition = current + (last - current) / 2;

        // if the categories are the same, we can't split here, as we are in the middle of a batch

        String categoryBeforeSplit = paymentList.get(splitPosition-1).getCategory();

        String categoryAfterSplit = paymentList.get(splitPosition).getCategory();


        // keep moving forward until we reach a split between categories

        while (categoryBeforeSplit.equals(categoryAfterSplit)) {

            splitPosition++;

            categoryBeforeSplit = categoryAfterSplit;

            categoryAfterSplit = paymentList.get(splitPosition).getCategory();

        }


        // safe to create a new spliterator

        PaymentBatchSpliterator secondHalf = new PaymentBatchSpliterator(paymentList,splitPosition,last);

        // reset our own last value

        last = splitPosition - 1;


        return secondHalf;

    }


    @Override

    public long estimateSize() {

        return last - current;

    }


    @Override

    public int characteristics() {

        return 0;

    }

}

是來自 GitHub參考的示例


查看完整回答
反對 回復(fù) 2021-12-10
  • 2 回答
  • 0 關(guān)注
  • 174 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號