2016-11-04 440 views
2

我是Java新手,如果这已经在其他地方得到了回答,那么我要么不知道搜索正确的东西,要么我无法理解答案。Java8流中集合中对象属性的平均值

所以,问题的存在: 我有一大堆对象的列表:

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; 

提前感谢!

回答

5

看看Collectors.groupingByCollectors.averagingDouble

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

Collectors.groupingBy方法,你想要做什么:你的情况,你可以按如下方式使用它们。它被重载了,这样你就可以指定返回键的函数了,这个函数返回创建返回地图的工厂(我在这里使用TreeMap,因为你希望按键排序,在这个例子中是URI) ,以及下游收集器,收集与第一个参数返回的键相匹配的元素。

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

这里假设LogLinegetUri()getRequestDuration()方法。

相关问题