我首先会像你已经做的那样:我会收集流MonitoredData
将实例映射到地图,按活动分组并对每个值中每个活动的持续时间求和:
Map<String, Long> map4 = data.stream()
.collect(Collectors.groupingBy(
MonitoredData::getActivity,
HashMap::new,
Collectors.summingLong(MonitoredData::getDuration)));
细微差别是我正在使用的重载版本Collectors.groupingBy接受地图工厂 http://docs.oracle.com/javase/8/docs/api/java/util/stream/Collectors.html#groupingBy-java.util.function.Function-java.util.function.Supplier-java.util.stream.Collector-,因为下一步我想删除持续时间小于 10 小时的条目,并且规范不保证返回的地图Collectors.groupingBy
采用一个或两个参数的方法是可变的。
这就是我删除不匹配的条目的方法:
public static final long TEN_HOURS_MS = 10 * 60 * 60 * 1000;
map4.values().removeIf(v -> v < TEN_HOURS_MS);
如果您想在一行中完成所有操作,您可能需要使用Collectors.collectingAndThen
:
Map<String, Long> map4 = data.stream()
.collect(Collectors.collectingAndThen(
Collectors.groupingBy(
MonitoredData::getActivity,
HashMap::new,
Collectors.summingLong(MonitoredData::getDuration)),
m -> { m.values().removeIf(v -> v < TEN_HOURS_MS); return m; } ));
这里我用过Collectors.collectingAndThen http://docs.oracle.com/javase/8/docs/api/java/util/stream/Collectors.html#collectingAndThen-java.util.stream.Collector-java.util.function.Function-修改返回的地图Collectors.groupingBy
。而且,在整理器功能中,我使用了Collection.removeIf https://docs.oracle.com/javase/8/docs/api/java/util/Collection.html#removeIf-java.util.function.Predicate-,它接受一个谓词并删除与该谓词匹配的所有条目。