代码之家  ›  专栏  ›  技术社区  ›  SCM

根据地图中的特性将地图分组到另一个地图中

  •  0
  • SCM  · 技术社区  · 2 年前

    我有以下代码:

    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和id,我想创建一个新的Map,其中所有id都按其Group分组。我可以使用for循环迭代地解决这个问题,但我想知道是否有使用groupingBy收集器的流替代方案。

    1 回复  |  直到 2 年前
        1
  •  1
  •   Sweeper    2 年前

    如果你只是使用 Collectors.groupingBy 分组依据 Group 。这会给你一个 Map<Group, List<Map.Entry<String, Id>>>

    但我们希望地图的值是另一个 Map ,所以我们应该通过 downstream collector groupingBy 这个 toMap 收藏家。下游是一股 Map.Entry<String, Id> ,所以地图的关键点是 entry.getKey ,值将是 Object s来自 ids .

    Map<Group, Map<String, Object>> idsByGroup = idDefinitions
        .entrySet().stream()
        .filter(x -> ids.containsKey(x.getKey()))
        .collect(
            Collectors.groupingBy(
                x -> x.getValue().group,
                Collectors.toMap(
                    Map.Entry::getKey,
                    x -> ids.get(x.getKey())
                )
            )
        );