我相信我更容易一步一步地写下我必须做的事情并复制我到目前为止的代码,而不是试图用长文解释它。
这就是我要做的事情:
这就是我现在所得到的:
try(Stream<String> logs = Files.lines(Paths.get(args))) {
logs.map(LogLine::parseLine).limit(10).sorted((e1, e2) -> Integer.compare(e1.getRequestDuration(),
e2.getRequestDuration()))
.collect(Collectors.groupingBy(
LogLine::getUri,
Collectors.averagingDouble(LogLine::getRequestDuration)));
return logs;
我是Java新手所以我有几个问题希望有人能为我解答:
我(我想)了解溪流是如何工作的,但是我在将它用于现实世界时遇到了麻烦。 我不一定要找到我面临的问题的完整代码,而不是那些能够提供理解如何操作所需信息的人。如果有人写出如何以正确的方式解决这些问题,我将非常感激。
答案 0 :(得分:2)
你可以在下面尝试,按URI分组,平均持续时间为值,从结果图中按值排序,并限制预期的结果数。
Map<String, Double> uriDurationMap = logs.map(LogLine::parseLine).collect(Collectors.groupingBy(LogLine::getUri,Collectors.averagingDouble(LogLine::getRequestDuration)));
从地图中排序和过滤
Map<String, Double> filteredMap = uriDurationMap.entrySet().stream().sorted(Comparator.comparing(Map.Entry::getValue)).limit(10).collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
保留订单使用LinkedHashMap
Map<String, Double> filteredMap = uriDurationMap.entrySet().stream().sorted(Comparator.comparing(Map.Entry::getValue)).limit(10).collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (k,v) -> v, LinkedHashMap::new));
如果仅需要值,
List<Double> filteredList = uriDurationMap.values().stream().sorted().limit(10).collect(Collectors.toList());