【问题标题】:Change map key from values that are content in value of the same map [duplicate]从同一地图的值中的值更改地图键[重复]
【发布时间】:2018-12-20 17:00:01
【问题描述】:

有下一张地图:

{
  G1=[
    User(id=1005, name=Jack, age=45), 
    User(id=1006, name=Carl, age=23),
    User(id=1007, name=Thomas, age=20),
    User(id=1008, name=Peter, age=19),
    User(id=1009, name=John, age=47),
    User(id=1010, name=Adrian, age=21),
    User(id=1011, name=Mariah, age=18)
  ],
  G2=[
    User(id=1005, name=Alfred, age=23), 
    User(id=1006, name=Barack, age=22),
    User(id=1007, name=Lee, age=36),
    User(id=1008, name=Andrew, age=33),
    User(id=1009, name=Sophia, age=22),
    User(id=1010, name=Lauren, age=19),
    User(id=1011, name=Mathias, age=33)
  ]
}

如何创建此地图:

{
  47=[
    User(id=1005, name=Jack, age=45), 
    User(id=1006, name=Carl, age=23),
    User(id=1007, name=Thomas, age=20),
    User(id=1008, name=Peter, age=19),
    User(id=1009, name=John, age=47),
    User(id=1010, name=Adrian, age=21),
    User(id=1011, name=Mariah, age=18)
  ],
  36=[
    User(id=1005, name=Alfred, age=23), 
    User(id=1006, name=Barack, age=22),
    User(id=1007, name=Lee, age=36),
    User(id=1008, name=Andrew, age=33),
    User(id=1009, name=Sophia, age=22),
    User(id=1010, name=Lauren, age=19),
    User(id=1011, name=Mathias, age=33)
  ]
}

其中新键是从用户列表中获取年龄属性最大值的结果。

在值中没有用户列表的地图中有效:

Original map: {G1=[45,23,20,19,47,21,18], G2=[23,22,36,33,22,19,33]}

Map<Integer, List<Integer>> newMap = mapa.entrySet().stream()
                .collect(Collectors.toMap(e -> Collections.max(e.getValue()),
                        Map.Entry::getValue));

Result: {47=[45,23,20,19,47,21,18], 36=[23,22,36,33,22,19,33]}

但是通过用户列表,我可以在 Collector.toMap 中获取对象。

任何帮助将不胜感激。

【问题讨论】:

    标签: java java-8 java-stream


    【解决方案1】:

    User映射到他们的年龄,然后得到最大值:

    source.values()
          .stream()
          .collect(toMap(l -> l.stream()
                            .mapToInt(User::getAge)
                            .max().getAsInt(), Function.identity()));
    

    或使用Collections.max:

    source.values()
         .stream()
         .collect(toMap(l -> Collections.max(l, 
              Comparator.comparingInt(User::getAge)).getAge(), Function.identity()));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-05-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-04
      • 2015-02-18
      • 1970-01-01
      相关资源
      最近更新 更多