簡體   English   中英

使用Java 8流分組在地圖列表列表中?

[英]Using Java 8 streams groupingBy on a list of list of maps?

從以下輸入

[
   [{group=a, value=cat}, {group=b, value=dog}],
   [{group=a, value=cow}, {group=b, value=bat}]
]

我如何獲得以下輸出

{
   a=[{value=cat}, {value=cow}],
   b=[{value=dog}, {value=bat}]
}

使用Java 8流?

我有以下標准解決方案

Map<String, String > map1 = new LinkedHashMap<>();
map1.put("group", "a");
map1.put("value", "cat");
Map<String, String > map2 = new LinkedHashMap<>();
map2.put("group", "b");
map2.put("value", "dog");
Map<String, String > map3 = new LinkedHashMap<>();
map3.put("group", "a");
map3.put("value", "cow");
Map<String, String > map4 = new LinkedHashMap<>();
map4.put("group", "b");
map4.put("value", "bat");

List<Map<String, String>> list1 = Arrays.asList(map1, map2);
List<Map<String, String>> list2 = Arrays.asList(map3, map4);

List<List<Map<String, String>>> input = Arrays.asList(list1, list2);

Map<String, List<Map<String, String>>> output = new LinkedHashMap<>();
for (List<Map<String, String>> list : input) {
   for (Map<String, String> map : list) {
       String group = map.get("group");
       if (!output.containsKey(group)) {
           output.put(group, new ArrayList<>());
       }
       List<Map<String, String>> values = output.get(group);
       values.add(map);
   }
}

我看到有一個Collectors.groupingBy方法,但我無法弄清楚如何使用它。

Map<String, List<Map<String, String>>> output = input.stream()
  .<am I missing out some steps here?>
  .collect(Collectors.groupingBy(<what goes here?>))

要生成相同的輸出,您應該在分組之前通過flatMap將列表列表展平到單個列表:

output = input.stream().flatMap(List::stream)
              .collect(Collectors.groupingBy(map -> map.get("group")));

此代碼生成與您發布的命令性代碼相同的輸出:

{
 a=[{group=a, value=cat}, {group=a, value=cow}], 
 b=[{group=b, value=dog}, {group=b, value=bat}]
}

但請注意,它與您想要的輸出不同。 要獲得所需的輸出,您可能需要指定下游收集器:

output = input.stream()
              .flatMap(List::stream)
              .collect(Collectors.groupingBy(map -> map.get("group"),
                 Collectors.mapping(
                     map -> Collections.singletonMap("value", map.get("value")), 
                      Collectors.toList())));

現在的結果是

{
  a=[{value=cat}, {value=cow}], 
  b=[{value=dog}, {value=bat}]
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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