Java流筛选器值之和
我有一个名为MonitoredData
的类,它描述了一个活动,它的开始时间和结束时间。属性是activityLabel
、startTime
、endTime
。我必须使用流对这些活动进行分组和筛选,这些活动的总持续时间超过10小时。我设法算出了持续时间的总和,并使用以下方法根据活动进行分组:
Map<String, Long> map4 = new HashMap<String, Long>();
map4 = data.stream()
.collect(
Collectors.groupingBy(
MonitoredData::getActivity,
Collectors.summingLong(MonitoredData::getDuration)
)
); //getDuration returns end Time - startTime in milliseconds
但我还没有添加过滤器。我试着使用:
.filter(Collectors.summingLong(MonitoredData::getDuration) > whatever)
但很明显,这是行不通的。如何解决这个问题,使其返回Map<String, Long>
# 1 楼答案
首先,我会像您已经做的那样:我将
MonitoredData
实例流收集到一个映射中,按活动分组,并将每个活动的持续时间和每个值相加:细微差别在于,我使用的是overloaded version of ^{} that accepts a factory for the map ,因为在下一步中,我想删除持续时间小于10小时的条目,并且规范不保证
Collectors.groupingBy
方法返回的映射是可变的,该方法使用一个或两个参数以下是我删除不匹配项的方法:
如果想在一行中完成所有操作,可能需要使用^{:
在这里,我使用^{} 修改了} ,它接受一个谓词并删除与该谓词匹配的所有条目
Collectors.groupingBy
返回的映射。在finisher函数中,我使用了^{# 2 楼答案
这个怎么样?我接电话,你需要自己测试
或使用
Collectors#collectingAndThen
:# 3 楼答案
我想这就是你想要的,使用 Google Guava Maps class:
很明显,你可以编写自己的方法来过滤这样的地图,但因为它已经存在,所以在如此流行的库中。。。如何使用纯流:我不知道,但也许这会令人满意