Java 流:转换地图的值

问题描述 投票:0回答:2

拥有

Map<A, Set<B>>
的实例,其中
B
是具有属性
Integer price
(以及其他)的 POJO,我如何优雅地将这个映射转换为
Map<A, Integer>
,其中
Integer
表示
prices
的总和给定的集合,对于每个键
A

java dictionary collections java-8 java-stream
2个回答
3
投票

您可以像这样使用流:

Map<A, Integer> result = map.entrySet().stream()
        .collect(Collectors.toMap(
                Map.Entry::getKey, 
                b -> b.getValue().stream()
                        .mapToInt(B::getPrice)
                        .sum()
                ));

-2
投票

这应该对你有帮助。使用 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));
© www.soinside.com 2019 - 2024. All rights reserved.