Java中Stream的teeing()方法用於處理合並兩個Collector - foojay
什麼是teeing()方法?
返回一個由兩個下游collectors組成的Collector。傳遞到結果collectors中的每個元素都是由兩個下游collectors處理的,然後使用指定的合併merge功能將它們的結果合併到最終結果中。
產生的Collector函式執行以下操作:
- supplier提供者:建立一個結果容器,其中包含通過呼叫每個collector的supplier而獲得的結果容器
- accumulator累加器:使用其結果容器和輸入元素呼叫每個collector的累加器
- combiner組合器:使用兩個結果容器呼叫每個collector的組合器
- finisher整理器:使用其結果容器呼叫每個collector的整理器,然後呼叫提供的合併並返回其結果。
針對在Stream流收集器的購物車DDD聚合真實示例 - foojay中案例:我們使用兩個簡單的Collector實現代替我們的自定義Collector,一個實現價格行的聚合,另一個購物車的價格彙總聚合。
public PriceAndRows getPriceAndRows(Cart cart) { return cart.getProducts() .entrySet() .stream() .map(CartRow::new) // 1 .collect(Collectors.teeing( // 2 Collectors.reducing( // 3 BigDecimal.ZERO, // 3.1 CartRow::getRowPrice, // 3.2 BigDecimal::add), // 3.3 Collectors.toList(), // 4 PriceAndRows::new // 5 )); } |
- 對映每個Entry到一個CartRow
- 呼叫teeing()方法
- 第一個collector收集器計算價格。這是一個簡單的reducing()呼叫,具有:起始元素;從CartRow提取Price;使用BinaryOperator將兩個價格加在一起
- 第二個收集器將彙總CartRow到一個列表中
- 最後,最後一個引數建立一個新物件,該物件彙總來自第一個和第二個收集器的結果
在實現方面,teeing():
- 提取兩個Collector中單個元件,即,supplier(), accumulator(), combiner() and finisher()`
- 並排配對
- 通過傳遞配對來建立一個新的Collector
原始碼: Github
相關文章
- Java 9 中的ofNullable方法 | foojayJavaNull
- Java Stream過濾器案例解說 - FoojayJava過濾器
- 用Java實現Stream流處理中的滑窗Java
- Java 中的並行處理Java並行
- java GC CollectorJavaGC
- Java 8 Stream並行流Java並行
- java stream()流對兩個集合進行比對Java
- Java中方法引用與Lambda區別 - foojayJava
- Java 8中處理集合的優雅姿勢——StreamJava
- C#中的並行處理、並行查詢的方法你用對了嗎?C#並行
- 探討Java中的多執行緒概念 - foojayJava執行緒
- 關於Java中的equals方法Java
- Java8中的Stream APIJavaAPI
- java中Stream的四種建立Java
- Java中的並行流處理與效能提升Java並行
- Java--- 關於null的處理若干方法JavaNull
- Java 8 中Stream用法Java
- iOS 用簡便的方法統計兩個陣列中不同的元素iOS陣列
- Java中的七種函式程式設計技術 - foojayJava函式程式設計
- java Stream結合函式方法Java函式
- Stream流收集器的購物車DDD聚合真實示例 - foojay
- Java中實現並行請求兩種方式Java並行
- java中Stream的使用流程及注意Java
- Java 8 Stream Api 中的 peek 操作JavaAPI
- Java中的函數語言程式設計(八)流Stream並行程式設計Java函數程式設計並行行程
- 如何避免Java程式碼中的空指標錯誤NullPointerException? - foojayJava指標NullException
- Java Optional的orElse()與orElseGet()兩個方法比較 - BaeldungJava
- Java Stream六個使用舉例Java
- 【Java 8 新特性】Java Stream 通過skip()方法跳過前N個子元素Java
- Window中檢視埠被哪個程序佔用,並結束程序的方法
- Java8中的 lambda 和Stream APIJavaAPI
- Java中stream流的filter機制理解JavaFilter
- Java中將Excel轉換為JSON的兩種方法JavaExcelJSON
- Java中計算兩個日期間的天數Java
- 強大的Stream並行流並行
- Java中處理SocketException: Connection reset”異常的方法JavaException
- Java 中關於 null 物件的容錯處理JavaNull物件
- Java 不可變集合 Stream流以及方法引用Java