[英]How to create list of object instead of map with groupingBy collector?
我有以下 stream 操作。
Map<String, Integer> pieDataMap = expenses.stream()
.collect(groupingBy(expense -> typeClassifier.apply(expense, chartCriteria),
summingInt(Expense::getCost)));
我不想獲取Map<String, Integer>
,而是獲取PieEntry
class 類型的對象列表,它有兩個 arg 構造函數PieEntry(String, Integer)
。 簡而言之,我想將 map 的每個條目(<String,Integer> 類型)轉換為 PieEntry class 的PieEntry
(帶有兩個參數構造函數)並將結果對象收集為
如何在不迭代生成的 map 並在額外循環中創建對象的情況下做到這一點?
如果問題是是否可以使用原始 stream 而不分組到 map 來完成,那么這是不可能的。 為了對結果進行分組,需要處理整個輸入,因為無法知道下游是否會有新元素最終進入其中一個組。
所以你必須得到一個分組 map 然后 map 它的條目到PieEntry
對象:
pieDataMap.stream().entrySet().stream().map(entry -> new PieEntry(entry.getKey(), entry.getValue()));
您也可以在.collect()
之后將其鏈接到原始 stream 鏈。
根據groupingBy
由 function 簽名,
static <T,K,A,D> Collector<T,?,Map<K,D>> groupingBy(Function<? super T,? extends K> classifier, Collector<? super T,A,D> downstream)
它返回一個收集器,該收集器產生(將元素收集到)map & 因為此操作是終端操作,導致 map 無法在同一語句中再處理。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.