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

資訊專(zhuān)欄INFORMATION COLUMN

Java8中Collectors求和功能的自定義擴(kuò)展

imtianx / 3255人閱讀

摘要:起因業(yè)務(wù)中需要將一組數(shù)據(jù)分類(lèi)后收集總和,原本可以使用,但是我們的數(shù)據(jù)源是類(lèi)型的,而原生只提供了三種基礎(chǔ)類(lèi)型的方法。于是就自己動(dòng)手豐衣足食吧。。期望目標(biāo)實(shí)踐依葫蘆先分析一下方法該方法接受類(lèi)型的參數(shù),返回類(lèi)型的實(shí)例化對(duì)象。

起因

業(yè)務(wù)中需要將一組數(shù)據(jù)分類(lèi)后收集總和,原本可以使用Collectors.summingInt(),但是我們的數(shù)據(jù)源是BigDecimal類(lèi)型的,而Java8原生只提供了summingInt、summingLong、summingDouble三種基礎(chǔ)類(lèi)型的方法。于是就自己動(dòng)手豐衣足食吧。。

期望目標(biāo):

Map result = Arrays.stream(records).parallel().collect(Collectors.groupingBy(
    Record::getType, CollectorsUtil.summingBigDecimal(Record::getAmount)));
實(shí)踐

1. 依葫蘆
先分析一下Collectors.summingInt()方法

public static  Collector summingInt(ToIntFunction mapper) {
    return new CollectorImpl<>(
        () -> new int[1],
        (a, t) -> { a[0] += mapper.applyAsInt(t); },
        (a, b) -> { a[0] += b[0]; return a; },
        a -> a[0], CH_NOID);
    }

該方法接受ToIntFunction類(lèi)型的參數(shù),返回CollectorImpl類(lèi)型的實(shí)例化對(duì)象。CollectorImplCollector接口的唯一實(shí)現(xiàn)類(lèi)

CollectorImpl(Supplier supplier,
                BiConsumer accumulator,
                BinaryOperator combiner,
                Function finisher,
                Set characteristics) {
        this.supplier = supplier;
        this.accumulator = accumulator;
        this.combiner = combiner;
        this.finisher = finisher;
        this.characteristics = characteristics;
    }

分析CollectorImpl的構(gòu)造器參數(shù),可知summingInt()方法是這樣的

arg[0]創(chuàng)建一個(gè)計(jì)算用的容器: () -> new int[1]
arg[1]為計(jì)算邏輯: (a, t) -> { a[0] += mapper.applyAsInt(t); }
arg[2]為合并邏輯: (a, b) -> { a[0] += b[0]; return a; }
arg[3]為返回最終計(jì)算值: a -> a[0]
arg[4]為空Set(不知道干什么用。。): Collections.emptySet()

2. 畫(huà)瓢
很自然的,BigDecimal的就是這樣了

public static  Collector summingBigDecimal(Function mapper) {
    return new CollectorImpl<>(() -> new BigDecimal[] { BigDecimal.ZERO }, (a, t) -> {
        a[0] = a[0].add(mapper.apply(t));
    }, (a, b) -> {
        a[0] = a[0].add(b[0]);
        return a;
    }, a -> a[0], CH_NOID);
}
Java8并行流的一些tips

千萬(wàn)注意共享變量的使用

注意裝箱拆箱的開(kāi)銷(xiāo)

基于數(shù)據(jù)量考慮使用并行流本身的成本

謹(jǐn)慎在并行流中使用事務(wù)

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/68088.html

相關(guān)文章

  • Java8特性④Stream收集數(shù)據(jù)

    摘要:多級(jí)分組的為鍵,類(lèi)型所對(duì)應(yīng)的集合為值一級(jí)分類(lèi)為的,二級(jí)分類(lèi)為的按子集收集數(shù)據(jù)的為鍵,類(lèi)型所對(duì)應(yīng)的集合的為值分區(qū)分區(qū)是分組的特殊情況由一個(gè)謂詞返回一個(gè)布爾值的函數(shù)作為分類(lèi)函數(shù),它稱(chēng)分區(qū)函數(shù)。 收集器可以簡(jiǎn)潔而靈活地定義collect用來(lái)生成結(jié)果集合的標(biāo)準(zhǔn)。更具體地說(shuō),對(duì)流調(diào)用 collect 方法將對(duì)流中的元素觸發(fā)一個(gè)歸約操作(由Collector來(lái)參數(shù)化)。一般來(lái)說(shuō),Collector...

    daryl 評(píng)論0 收藏0
  • Java8實(shí)戰(zhàn)》-第六章讀書(shū)筆記(用流收集數(shù)據(jù)-01)

    摘要:收集器用作高級(jí)歸約剛剛的結(jié)論又引出了優(yōu)秀的函數(shù)式設(shè)計(jì)的另一個(gè)好處更易復(fù)合和重用。更具體地說(shuō),對(duì)流調(diào)用方法將對(duì)流中的元素觸發(fā)一個(gè)歸約操作由來(lái)參數(shù)化。另一個(gè)常見(jiàn)的返回單個(gè)值的歸約操作是對(duì)流中對(duì)象的一個(gè)數(shù)值字段求和。 用流收集數(shù)據(jù) 我們?cè)谇耙徽轮袑W(xué)到,流可以用類(lèi)似于數(shù)據(jù)庫(kù)的操作幫助你處理集合。你可以把Java 8的流看作花哨又懶惰的數(shù)據(jù)集迭代器。它們支持兩種類(lèi)型的操作:中間操作(如 filt...

    EscapedDog 評(píng)論0 收藏0
  • Java8-Lambda表達(dá)式使用與Stream API

    摘要:前置數(shù)據(jù)提取對(duì)象中的一列提取列第一種寫(xiě)法簡(jiǎn)單一點(diǎn)的寫(xiě)法通過(guò)字段中條件過(guò)濾集合列表只要年紀(jì)大于歲的人列表中對(duì)象數(shù)值型列數(shù)據(jù)求和求和全部年紀(jì)取出集合符合條件的第一個(gè)元素取出年紀(jì)為歲的人簡(jiǎn)寫(xiě)對(duì)集合中對(duì)象 0x00. 前置數(shù)據(jù) private List peoples = null; @BeforeEach void before () { peoples = new ArrayL...

    endless_road 評(píng)論0 收藏0
  • Java8流特性和Lambda表達(dá)式

    摘要:表達(dá)式體現(xiàn)了函數(shù)式編程的思想,即一個(gè)函數(shù)亦可以作為另一個(gè)函數(shù)參數(shù)和返回值,使用了函數(shù)作參數(shù)返回值的函數(shù)被稱(chēng)為高階函數(shù)。對(duì)流對(duì)象進(jìn)行及早求值,返回值不在是一個(gè)對(duì)象。 Java8主要的改變是為集合框架增加了流的概念,提高了集合的抽象層次。相比于舊有框架直接操作數(shù)據(jù)的內(nèi)部處理方式,流+高階函數(shù)的外部處理方式對(duì)數(shù)據(jù)封裝更好。同時(shí)流的概念使得對(duì)并發(fā)編程支持更強(qiáng)。 在語(yǔ)法上Java8提供了Lamb...

    gaara 評(píng)論0 收藏0
  • Java8實(shí)用技能

    大概一年多之前,我對(duì)java8的理解還僅限一些只言片語(yǔ)的文章之上,后來(lái)出于對(duì)函數(shù)式編程的興趣,買(mǎi)了本參考書(shū)看了一遍,然后放在了書(shū)架上,后來(lái),當(dāng)我接手大客戶應(yīng)用的開(kāi)發(fā)工作之后,java8的一些工具,對(duì)我的效率有了不小的提升,因此想記錄一下java8的一些常用場(chǎng)景,我希望這會(huì)成為一個(gè)小字典,能讓我免于頻繁翻書(shū),但是總能找到自己想找的知識(shí)。 用于舉例的model: @Data public class ...

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

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

0條評(píng)論

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