簡體   English   中英

如何使用 groupingBy 收集器創建 object 而不是 map 列表?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM