首页 > 解决方案 > 合并 Group by 中的两个地图

问题描述

我有物品清单,

class Item {
    int id;
    String name;
    Map<String, String> map;
}

Item item1 = new Item(11, "name1", Map.of("k1", "v1"));
Item item2 = new Item(11, "name1", Map.of("k2", "v2"));
Item item3 = new Item(22, "name2", Map.of("k3", "v3"));
.
.
.

List<Item> list = List.of(item1, item2, item3 ...);

我想按 id 分组,但地图值保留不同的值,如下所示,

List<Item> output = [ 11, "name1", map: { ["k1", "v1"],["k2", "v2"])) ], [ 22, "name2", map: { ["k3", "v3"] ] .....;

我尝试使用 group by 并返回,我怎样才能在其中保留地图?

 Map<Integer, List<Item>> collect = list.stream()
              .collect(Collectors.groupingBy(Item::getId, Collectors.toList()));

标签: javajava-stream

解决方案


要解决您的问题,您需要遍历这些值,并创建一个新项目,并将所有地图分组为一个:

List<Item> response = list.stream()
        .collect(Collectors.groupingBy(
                Item::getId, Collectors.toList()))
        .values().stream()
        .map(v -> {
            Item item = v.get(0);
            Map<String, String> map = v.stream()
                    .flatMap(e -> e.getMap().entrySet().stream())
                    .collect(Collectors.toMap(
                            Map.Entry::getKey,
                            Map.Entry::getValue,
                            (a, b) -> a));
            return new Item(item.getId(), item.getName(), map);
        }).collect(Collectors.toList());

推荐阅读