如何从流中映射java中的Duration字段的总和?

时间:2017-05-15 18:21:23

标签: dictionary java-8 java-stream

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

通常,我会像这样解决它:

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

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

1 个答案:

答案 0 :(得分:4)

使用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);
}