根据地图内的属性将一个地图分组为另一个映射

问题描述 投票:0回答:1

我有以下代码:

class Scratch {

  public static void main(String[] args) {
    Map<String, Id> idDefinitions = Map.of(
      "A", new Id(Group.GROUP_A),
      "B", new Id(Group.GROUP_B),
      "C", new Id(Group.GROUP_A));

    Map<String, Object> ids = Map.of("A", new Object(), "B", new Object(), "C", new Object());
    
    Map<Group, Map<String, Object>> idsByGroup = ?
  }

  private static class Id {
    private Group group;
    public Id(Group group) {
      this.group = group;
    }
  }

  private enum Group {
    GROUP_A,
    GROUP_B
  }
}

基于 idDefinitions 和 ids,我想创建一个新的 Map,其中所有 id 均按其组进行分组。我可以使用 for 循环迭代地解决这个问题,但我想知道是否有流替代方案,使用 groupingBy 收集器。

java stream java-stream
1个回答
0
投票

如果您只是使用

Collectors.groupingBy
Group
进行分组。这会给你一个
Map<Group, List<Map.Entry<String, Id>>>

但是我们希望地图的值是另一个

Map
,因此我们应该将下游收集器传递给
groupingBy
,即
toMap
收集器。下游是
Map.Entry<String, Id>
流,因此地图的键将是
entry.getKey
,值将是
Object
中的
ids

Map<Group, Map<String, Object>> idsByGroup = idDefinitions
    .entrySet().stream()
    .collect(
        Collectors.groupingBy(
            x -> x.getValue().group,
            Collectors.toMap(
                Map.Entry::getKey,
                x -> ids.get(x.getKey())
            )
        )
    );
© www.soinside.com 2019 - 2024. All rights reserved.