摘要:起因業務中需要將一組數據分類后收集總和,原本可以使用,但是我們的數據源是類型的,而原生只提供了三種基礎類型的方法。于是就自己動手豐衣足食吧。。期望目標實踐依葫蘆先分析一下方法該方法接受類型的參數,返回類型的實例化對象。
起因
業務中需要將一組數據分類后收集總和,原本可以使用Collectors.summingInt(),但是我們的數據源是BigDecimal類型的,而Java8原生只提供了summingInt、summingLong、summingDouble三種基礎類型的方法。于是就自己動手豐衣足食吧。。
期望目標:
Map實踐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>類型的參數,返回CollectorImpl類型的實例化對象。CollectorImpl是Collector接口的唯一實現類
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的構造器參數,可知summingInt()方法是這樣的
arg[0]創建一個計算用的容器: () -> 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 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); }
千萬注意共享變量的使用
注意裝箱拆箱的開銷
基于數據量考慮使用并行流本身的成本
謹慎在并行流中使用事務
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/68088.html
摘要:多級分組的為鍵,類型所對應的集合為值一級分類為的,二級分類為的按子集收集數據的為鍵,類型所對應的集合的為值分區分區是分組的特殊情況由一個謂詞返回一個布爾值的函數作為分類函數,它稱分區函數。 收集器可以簡潔而靈活地定義collect用來生成結果集合的標準。更具體地說,對流調用 collect 方法將對流中的元素觸發一個歸約操作(由Collector來參數化)。一般來說,Collector...
摘要:收集器用作高級歸約剛剛的結論又引出了優秀的函數式設計的另一個好處更易復合和重用。更具體地說,對流調用方法將對流中的元素觸發一個歸約操作由來參數化。另一個常見的返回單個值的歸約操作是對流中對象的一個數值字段求和。 用流收集數據 我們在前一章中學到,流可以用類似于數據庫的操作幫助你處理集合。你可以把Java 8的流看作花哨又懶惰的數據集迭代器。它們支持兩種類型的操作:中間操作(如 filt...
摘要:前置數據提取對象中的一列提取列第一種寫法簡單一點的寫法通過字段中條件過濾集合列表只要年紀大于歲的人列表中對象數值型列數據求和求和全部年紀取出集合符合條件的第一個元素取出年紀為歲的人簡寫對集合中對象 0x00. 前置數據 private List peoples = null; @BeforeEach void before () { peoples = new ArrayL...
摘要:表達式體現了函數式編程的思想,即一個函數亦可以作為另一個函數參數和返回值,使用了函數作參數返回值的函數被稱為高階函數。對流對象進行及早求值,返回值不在是一個對象。 Java8主要的改變是為集合框架增加了流的概念,提高了集合的抽象層次。相比于舊有框架直接操作數據的內部處理方式,流+高階函數的外部處理方式對數據封裝更好。同時流的概念使得對并發編程支持更強。 在語法上Java8提供了Lamb...
大概一年多之前,我對java8的理解還僅限一些只言片語的文章之上,后來出于對函數式編程的興趣,買了本參考書看了一遍,然后放在了書架上,后來,當我接手大客戶應用的開發工作之后,java8的一些工具,對我的效率有了不小的提升,因此想記錄一下java8的一些常用場景,我希望這會成為一個小字典,能讓我免于頻繁翻書,但是總能找到自己想找的知識。 用于舉例的model: @Data public class ...
閱讀 3799·2021-09-23 11:32
閱讀 2466·2021-09-06 15:01
閱讀 1625·2021-08-18 10:24
閱讀 3462·2019-12-27 11:44
閱讀 3611·2019-08-30 15:52
閱讀 2519·2019-08-30 11:11
閱讀 691·2019-08-29 17:27
閱讀 606·2019-08-29 16:22