作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试创建一个包含事件及其总持续时间的 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/
我是一名优秀的程序员,十分优秀!