当前位置: 首页 > 知识库问答 >
问题:

Java流过滤器值之和

靳富
2023-03-14

我有一个名为monitoreddata的类,用它描述活动及其开始时间和结束时间。这些属性是ActivityLabelStartTimeEndTime。我必须使用流对这些活动进行分组和过滤,这些活动的总持续时间超过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)

共有1个答案

薄龙光
2023-03-14

我将首先像您已经做的那样做:我将monitoreddata实例流收集到一个映射中,按活动分组,并将每个活动的持续时间加在每个值中:

Map<String, Long> map4 = data.stream()
    .collect(Collectors.groupingBy(
        MonitoredData::getActivity, 
        HashMap::new,
        Collectors.summingLong(MonitoredData::getDuration)));

细微差别在于,我使用的是collectors.groupingby的重载版本,它接受映射的工厂,因为在下一步中,我希望删除持续时间小于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修改collectors.groupingby返回的映射。而且,在finisher函数中,我使用了collection.removeif,它接受一个谓词并删除与该谓词匹配的所有条目。

 类似资料:
  • 有没有办法把这两条流合并成一条?我使用第一个流在嵌套列表中进行过滤和查找,并使用第二个流根据流的结果创建地图。我想知道是否有一种方法可以用一条流来实现这一点。 像这样的

  • 将此流收集到列表中 正如我所看到的,infinity循环有一些问题,所以peek()打印范围内的数字(12,99),这是可以的,但之后它再次打印范围内的数字(11,98),等等,你能解释一下我在哪里犯了错误吗?

  • 过滤器作为读写操作的流内容传输过程中的附加阶段. 要注意的是直到php 4.3中才加入了流过滤器, 在php 5.0对流过滤器的API设计做过较大的调整. 本章的内容遵循的是php 5的流过滤器规范. 在流上应用已有的过滤器 在一个打开的流上应用一个已有的过滤器只需要几行代码即可: php_stream *php_sample6_fopen_read_ucase(const char *path

  • 我有两个简单的POJOs: 然后我生成一些数据,我为父母添加100个孩子: 我的目标是移除所有10岁以下的儿童: 最后,我列出了十岁以上的孩子。但是我不想写一个单独的方法。 如何得到所有的父母与名单上的孩子十岁以上只使用单一流?

  • 19 比特流滤镜 默认编译时所有的比特流滤镜都被支持,你可以在配置脚本中以--list-bsfs获取有效的滤镜列表 可以利用--disable-bsfs禁用所有的比特流滤镜。要指定个别的滤镜可用,则在此基础上--enable-bsf=BSF,或者在默认(没有指定--disable-bsfs)下禁用个别的滤镜--disable-bsf=BSF,这里BSF是个别滤镜名称。 在ff*工具集中,-bsfs

  • 主要内容:1.概述,2.ClassLoaderFilter1.概述 在 ProtocolFilterWrapper 中,在服务引用和暴露时,#buildInvokerChain(invoker, key, group) 方法中,基于 Dubbo SPI Active 机制,加载匹配对应的过滤器数组,创建带有过滤器链的 Invoker 对象。代码如下: 2.ClassLoaderFilter 实现 Filter 接口,类加载器切换过滤器实现类。代码如下: