我是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;
提前致谢!
答案 0 :(得分:5)
查看Collectors.groupingBy
和Collectors.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",
.......
.......
}
}
]
}
方法。