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

标签 dictionary java-8 java-stream

我正在尝试创建一个包含事件及其总持续时间的 map ,并知道该事件会以不同的持续时间出现更多次。

通常情况下,我会这样解决:

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

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

最佳答案

使用3-argument version toMap 收集器:

import static java.util.stream.Collectors.toMap;

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

另外,请注意 Map 接口(interface)在 Java 8 中添加了一些不错的功能。其中之一是 merge 。这样,甚至您的迭代 for 循环也可以重写得更加简洁:

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

关于dictionary - 如何从流中映射java中Duration字段的总和?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43986346/

相关文章:

java - 流式传输不同的数据类型

java - Map .get()、.containsKey() 方法不起作用

java - 在 map 中组合两个不同的字符串

java - 如何在运行时获取java中的参数名称

java - 斯卡拉 2.12 : What is the equivalent of Java 8 method reference for universally quantified SAM trait?

java-8 - 如何使用流将一维整数数组转换为映射

wpf - 合并字典中共享的静态资源

python - 提取具有多个值的 : Python dictionary, 键

java - 使用 Java 流将 List<int[]> 更改为 Map<int[],int[]>

java - 为什么这个流不返回任何元素?