Oan*_*aV. 5 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());
}
Run Code Online (Sandbox Code Playgroud)
但是我试图通过流来做到这一点,但是我不知道如何将总和放入其中。
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()))
);
Run Code Online (Sandbox Code Playgroud)
我尝试了各种方式将它们分组,直接映射或直接将它们汇总在方括号中,但我陷入了困境。
使用3参数版本的toMap收集器:
import static java.util.stream.Collectors.toMap;
Map<String,Duration> result = lista.stream()
.collect(toMap(MonitoredData::getActivity, MonitoredData::getDuration, Duration::plus));
Run Code Online (Sandbox Code Playgroud)
另外,请注意,Map接口在Java 8中有一些不错的添加。其中之一是merge。这样,甚至您的迭代for循环也可以重写为更加简洁:
for (MonitoredData m: lista) {
result.merge(m.getActivity(), m.getDuration(), Duration::plus);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
643 次 |
| 最近记录: |