【问题标题】:How map from a stream the sum of a Duration field in java?java - 如何从流中映射Java中持续时间字段的总和?
【发布时间】:2017-05-15 18:21:22
【问题描述】:

我正在尝试创建一个包含活动和该活动总持续时间的地图,因为我知道该活动以不同的持续时间出现更多次。

通常,我会这样解决它:

Map<String,Duration> result2 = new HashMap<String,Duration>();
     for(MonitoredData m: lista)
     {
         if(result2.containsKey(m.getActivity())) result2.replace(m.getActivity(),result2.get(m.getActivity()).plus(m.getDuration()));
         else result2.put(m.getActivity(), m.getDuration());
     }

但我正在尝试使用流来执行此操作,但我不知道如何将总和放入其中。

Function<Duration, Duration> totalDuration = x -> x.plus(x);
Map<String, Duration> result2 = lista.stream().collect(
                        Collectors.groupingBy(MonitoredData::getActivity,
                                Collectors.groupingBy(totalDuration.apply(), Collectors.counting()))
                );

我尝试了各种方式对它们进行分组,直接映射它们,或者直接在括号中求和,但我卡住了。

【问题讨论】:

    标签: dictionary java-8 java-stream


    【解决方案1】:

    使用toMap收集器的3-argument version

    import static java.util.stream.Collectors.toMap;
    
    Map<String,Duration> result = lista.stream()
        .collect(toMap(MonitoredData::getActivity, MonitoredData::getDuration, Duration::plus));
    

    另外,请注意 Map 接口在 Java 8 中得到了一些不错的补充。其中之一是 merge。有了它,即使是你的迭代 for 循环也可以重写得更简洁:

    for (MonitoredData m: lista) {
        result.merge(m.getActivity(), m.getDuration(), Duration::plus);
    }
    

    【讨论】:

      猜你喜欢
      • 2019-03-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-24
      • 2021-09-05
      • 2019-07-03
      • 1970-01-01
      • 2019-08-09
      • 1970-01-01
      相关资源
      最近更新 更多