Java8流集合中对象属性的平均值

时间:2016-11-04 12:13:11

标签: sorting collections java-8 average java-stream

我是Java的新手,所以如果已经在其他地方回答了这个问题,那么我要么不知道搜索正确的内容还是我无法理解答案。

所以问题是: 我在列表中有一堆对象:

try(Stream<String> logs = Files.lines(Paths.get(args))) {

        return logs.map(LogLine::parseLine).collect(Collectors.toList());


    }

这就是添加属性的方式:

        LogLine line = new LogLine();
    line.setUri(matcher.group("uri"));
    line.setrequestDuration(matcher.group("requestDuration"));
    ....

如何对日志进行排序,以便最终得到列表,其中具有相同“uri”的对象仅以平均requestDuration显示一次。

示例:

         object1.uri = 'uri1', object1.requestDuration = 20;
         object2.uri = 'uri2', object2.requestDuration = 30;
         object3.uri = 'uri1', object3.requestDuration = 50;

结果:

        object1.uri = 'uri1', 35;
        object2.uri = 'uri2', 30;

提前致谢!

1 个答案:

答案 0 :(得分:5)

查看Collectors.groupingByCollectors.averagingDouble。在您的情况下,您可以按如下方式使用它们:

Collectors.groupingBy

TreeMap方法可以满足您的需求。它被重载了,所以你可以指定返回组元素的键的函数,创建返回映射的工厂(我在这里使用Integer,因为你想要按键排序的条目,在这里例如,URI)和下游收集器,它收集与第一个参数返回的密钥匹配的元素。

如果您希望平均值为Double而不是LogLine,请考虑使用Collectors.averagingInt

这假定getUri()具有getRequestDuration(){ "apps": [ { "name": "Example", "script": "boot/app/app.js", "watch": false, "exec_mode": "cluster_mode", "instances": 2, "merge_logs": true, "cwd": "/srv/www.example.com/server", "env": { "NODE_ENV": "development", ....... ....... } } ] } 方法。