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

5

I have two object. The first one:

public final class Object1 {
    private String a;
    private String b;
    // constructor getter and setter
}

第二个:
public class Object2 {
    private BigDecimal value1;
    private BigDecimal value2;
    // constructor getter and setter
}

我有一个 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}
........

我希望将这张地图与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}}
...

我尝试了类似这样的东西:
Map<String, List<Object2>> map1 = map.entrySet()
   .stream()             
   .collect(Collectors.toMap(e -> e.getKey().getA(), list of object with this key);

1
https://docs.oracle.com/javase/8/docs/api/java/util/stream/Collectors.html#groupingBy-java.util.function.Function-java.util.stream.Collector- - JB Nizet
1个回答

5
yourMap.entrySet()
       .stream()
       .collect(Collectors.groupingBy(e -> e.getKey().getA(),
               Collectors.mapping(Entry::getValue, Collectors.toList())))

如何使用collect语句将具有相同“a”的Map分组,并计算Object2列表中所有value1的平均值?类似于a="15",Object2.value1的平均值,a="16",Object2.value1的平均值。 - emoleumassi
@emoleumassi 所以基本上您想要一个 Map<String, BigDecimal>,其中值是所有 value1 中的 min - Eugene
是的,一个Map<String, BigDecimal>,其中value是所有value1中的最小值。 - emoleumassi
3
@emoleumassi map.entrySet() .stream() .collect(Collectors.groupingBy(x -> x.getKey().getA(), Collectors.mapping(x -> x.getValue().getValue1(), Collectors.collectingAndThen( Collectors.minBy(Comparator.naturalOrder()), Optional::get))))这段代码的意思是将一个Map按照其key的属性A进行分组,然后对每个分组中的value值取出其中的Value1属性并返回最小值。该操作是通过Java 8中的流式编程实现的。 - Eugene
2
@Eugene 或者只需使用 map.entrySet().stream().collect(Collectors.toMap(x -> x.getKey().getA(), x -> x.getValue().getValue1(), BigDecimal::min)),这样会更简洁。 - fps
@Eugene 以防万一,测试一下(我在全国最慢的公交车上打电话)... - fps

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接