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)
提前致谢!
看看Collectors.groupingBy和Collectors.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.
这假设LogLine有getUri()和getRequestDuration()方法.
| 归档时间: |
|
| 查看次数: |
832 次 |
| 最近记录: |