【问题标题】:Java streams: transforming map's valuesJava 流:转换映射的值
【发布时间】:2021-04-16 10:17:45
【问题描述】:

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

【问题讨论】:

  • @Michael 这不是很有帮助的评论。我知道如何用显式循环解决它,我不确定流。
  • @weno 然后展示你的循环尝试。这样就很容易创建流解决方案

标签: java dictionary collections java-8 stream


【解决方案1】:

你可以像这样使用流:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-20
      • 1970-01-01
      • 2022-11-01
      • 2013-05-30
      • 1970-01-01
      • 1970-01-01
      • 2013-10-22
      • 1970-01-01
      相关资源
      最近更新 更多