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.util.Collections中的sort方法對兩個類的物件進行排序Java物件排序
- Java 8中處理集合的優雅姿勢——StreamJava
- 如何讓兩個表單處於不同的執行緒中執行緒
- 探討Java中的多執行緒概念 - foojayJava執行緒
- C#中的並行處理、並行查詢的方法你用對了嗎?C#並行
- 一個用於實現並行執行的 Java actor 庫並行Java
- java中Stream的四種建立Java
- Java8中的Stream APIJavaAPI
- Java 8 中Stream用法Java
- Java中的七種函式程式設計技術 - foojayJava函式程式設計
- 關於Java中的equals方法Java
- Java中的並行流處理與效能提升Java並行
- Stream流收集器的購物車DDD聚合真實示例 - foojay
- iOS 用簡便的方法統計兩個陣列中不同的元素iOS陣列
- java中Stream的使用流程及注意Java
- Java 8 Stream Api 中的 peek 操作JavaAPI
- Java反射機制demo(五)—獲得並呼叫一個類中的方法Java反射
- 如何避免Java程式碼中的空指標錯誤NullPointerException? - foojayJava指標NullException
- Java中實現並行請求兩種方式Java並行
- Java--- 關於null的處理若干方法JavaNull
- shell中如何處理兩個數的減法
- java Stream結合函式方法Java函式
- Python求兩個list的差集、交集與並集的方法Python
- Java中的函數語言程式設計(八)流Stream並行程式設計Java函數程式設計並行行程
- Java8中的 lambda 和Stream APIJavaAPI
- Java 8中的Stream API使用指南JavaAPI
- Java中stream流的filter機制理解JavaFilter
- C#中遍歷TreeView的兩個常用方法C#View
- [Shell] Input null到檔案中的兩個方法Null
- Java中main()方法為什麼採用這個方法簽名JavaAI