拥有
Map<A, Set<B>>
的实例,其中 B
是具有属性 Integer price
(以及其他)的 POJO,我如何优雅地将这个映射转换为 Map<A, Integer>
,其中 Integer
表示 prices
的总和给定的集合,对于每个键A
?
您可以像这样使用流:
Map<A, Integer> result = map.entrySet().stream()
.collect(Collectors.toMap(
Map.Entry::getKey,
b -> b.getValue().stream()
.mapToInt(B::getPrice)
.sum()
));
这应该对你有帮助。使用 Java 8 中的 Streaming-API: (在此示例中,类“PricePojo”是您的 B,“String”是您的 A)
Map<String, Integer> newMap = map.entrySet().stream()//
.collect(Collectors.toMap(Entry::getKey, entry -> entry.getValue().stream().mapToInt(PricePojo::getPrice).sum()));
您也可以自己实现 Map.Entry,如下例所示:
Map<String, Integer> newMap = map.entrySet().stream()//
.map(entry -> new Map.Entry<String, Integer>() {
private int sum = entry.getValue().stream().mapToInt(PricePojo::getPrice).sum();
@Override
public String getKey() {
return entry.getKey();
}
@Override
public Integer getValue() {
return sum;
}
@Override
public Integer setValue(Integer value) {
return sum = value.intValue();
}
}).collect(Collectors.toMap(Entry::getKey, Entry::getValue));