摘要:起因業(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實(shí)踐result = Arrays.stream(records).parallel().collect(Collectors.groupingBy( Record::getType, CollectorsUtil.summingBigDecimal(Record::getAmount)));
1. 依葫蘆
先分析一下Collectors.summingInt()方法
public staticCollector summingInt(ToIntFunction super T> 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 super T>類(lèi)型的參數(shù),返回CollectorImpl類(lèi)型的實(shí)例化對(duì)象。CollectorImpl是Collector接口的唯一實(shí)現(xiàn)類(lèi)
CollectorImpl(Supplier supplier, BiConsumer accumulator, BinaryOperator combiner, Function finisher, Setcharacteristics) { 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 staticJava8并行流的一些tipsCollector summingBigDecimal(Function super T, BigDecimal> 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); }
千萬(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
摘要:多級(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...
摘要:收集器用作高級(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...
摘要:前置數(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...
摘要:表達(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...
大概一年多之前,我對(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 ...
閱讀 3783·2021-09-23 11:32
閱讀 2451·2021-09-06 15:01
閱讀 1617·2021-08-18 10:24
閱讀 3450·2019-12-27 11:44
閱讀 3605·2019-08-30 15:52
閱讀 2512·2019-08-30 11:11
閱讀 674·2019-08-29 17:27
閱讀 600·2019-08-29 16:22