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

Rau*_*uno 2 sorting collections average java-8 java-stream

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

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

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

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


    }
Run Code Online (Sandbox Code Playgroud)

这就是添加属性的方式:

        LogLine line = new LogLine();
    line.setUri(matcher.group("uri"));
    line.setrequestDuration(matcher.group("requestDuration"));
    ....
Run Code Online (Sandbox Code Playgroud)

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

例:

         object1.uri = 'uri1', object1.requestDuration = 20;
         object2.uri = 'uri2', object2.requestDuration = 30;
         object3.uri = 'uri1', object3.requestDuration = 50;
Run Code Online (Sandbox Code Playgroud)

结果:

        object1.uri = 'uri1', 35;
        object2.uri = 'uri2', 30;
Run Code Online (Sandbox Code Playgroud)

提前致谢!

Fed*_*ner 5

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

Map<String, Double> result = logLines.stream()
    .collect(Collectors.groupingBy(
        LogLine::getUri,
        TreeMap::new,
        Collectors.averagingDouble(LogLine::getRequestDuration)));
Run Code Online (Sandbox Code Playgroud)

Collectors.groupingBy方法可以满足您的需求.它被重载,因此您可以指定返回组元素的键的函数,创建返回映射的工厂(我在TreeMap这里使用,因为您希望按键排序的条目,在本例中为URI),和下游收集器,它收集与第一个参数返回的键匹配的元素.

如果您想要平均值Integer而不是Double值,请考虑使用Collectors.averagingInt.

这假设LogLinegetUri()getRequestDuration()方法.