Java 8收集到Map <String,List <Object >>

emo*_*ssi 5 java java-8

我有两个对象.第一个:

public final class Object1 {
    private String a;
    private String b;
    // constructor getter and setter
}
Run Code Online (Sandbox Code Playgroud)

第二个:

public class Object2 {
    private BigDecimal value1;
    private BigDecimal value2;
    // constructor getter and setter
}
Run Code Online (Sandbox Code Playgroud)

我有一个Map<Object1, Object2>:

    Object1{a="15", b="XXX"}, Object2{value1=12.1, value2=32.3}
    Object1{a="15", b="YYY"}, Object2{value1=21.1, value2=24.3}
    Object1{a="16", b="AAA"}, Object2{value1=34.1, value2=45.3}
    Object1{a="15", b="BBB"}, Object2{value1=23.1, value2=65.3}
    Object1{a="15", b="DDD"}, Object2{value1=23.1, value2=67.3}
    Object1{a="17", b="CCC"}, Object2{value1=78.1, value2=2.3}
........
Run Code Online (Sandbox Code Playgroud)

我想在Object2列表中使用相同的a对此映射进行分组,如:

a="15", {{value1=12.1, value2=32.3}, {value1=21.1, value2=24.3}, {value1=23.1, value2=65.3}, {value1=23.1, value2=67.3}},
a="16", {{value1=34.1, value2=45.3}}
...
Run Code Online (Sandbox Code Playgroud)

我尝试这样的事情:

Map<String, List<Object2>> map1 = map.entrySet()
   .stream()             
   .collect(Collectors.toMap(e -> e.getKey().getA(), list of object with this key);
Run Code Online (Sandbox Code Playgroud)

Eug*_*ene 5

yourMap.entrySet()
       .stream()
       .collect(Collectors.groupingBy(e -> e.getKey().getA(),
               Collectors.mapping(Entry::getValue, Collectors.toList())))
Run Code Online (Sandbox Code Playgroud)

  • @emoleumassi `map.entrySet() .stream() .collect(Collectors.groupingBy(x -&gt; x.getKey().getA(), Collectors.mapping(x -&gt; x.getValue().getValue1(), Collectors .collectingAndThen(Collectors.minBy(Comparator.naturalOrder()), Optional::get))))` (3认同)
  • @Eugene或只是`map.entrySet().stream().collect(Collectors.toMap(x - > x.getKey().getA(),x - > x.getValue().getValue1(),BigDecimal :: min))`,这个很短 (2认同)
  • @FedericoPeraltaSchaffner哦拍!:( 感谢你 (2认同)