亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

Java8中Collectors求和功能的自定義擴展

imtianx / 3314人閱讀

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

起因

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

期望目標:

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

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類型的參數(shù),返回CollectorImpl類型的實例化對象。CollectorImplCollector接口的唯一實現(xiàn)類

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的構造器參數(shù),可知summingInt()方法是這樣的

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

2. 畫瓢
很自然的,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

千萬注意共享變量的使用

注意裝箱拆箱的開銷

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

謹慎在并行流中使用事務

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

轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/68088.html

相關文章

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

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

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

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

    EscapedDog 評論0 收藏0
  • Java8-Lambda表達式使用與Stream API

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

    endless_road 評論0 收藏0
  • Java8流特性和Lambda表達式

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

    gaara 評論0 收藏0
  • Java8實用技能

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

    microcosm1994 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<