从相同地图值中包含的值更改地图键

时间:2018-12-20 17:00:01

标签: java java-8 java-stream

具有下一张地图:

{
  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)
  ]
}

其中的新键是从“用户”列表中获得age属性的最大值的结果。

在没有“用户”列表的值的地图中,此方法有效:

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中获取对象。

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:-2)

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()));