Java 流处理顺序

标签 java sorting java-8 java-stream collectors

我相信对我来说,一步步写出我必须做的事情并复制到目前为止的代码比尝试用长文本解释它更容易。

这是我必须做的:

  1. 逐行读取文件
  2. 在这些行中映射键
  3. 按 1 个键(下面代码中的 getUri)合并行并(获取另一个键 (getRequestDuration) 的平均值)
  4. 按合并的 getRequestDuration 的平均值排序(最高的在前)
  5. 返回最高的 n 个金额。

这就是我现在得到的:

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 新手,所以我有几个问题希望有人能回答我:

  1. 在排序之前收集/分组后如何排序?
  2. 如何适当限制?这样它限制了我返回的条目数量,而不是我浏览的条目数量。

我(认为我)了解流的工作原理,但我在将其应用于现实世界时遇到了困难。 我不一定要寻找我所面临的问题的完整代码,而不是寻找可以向我提供了解如何做到这一点所需的信息的人。如果有人写出如何以正确的方式解决流的此类问题,我将非常感激。

最佳答案

您可以尝试以下操作,按 URI 和平均持续时间作为值进行分组,从结果映射中按值排序并限制预期结果的数量。

    Map<String, Double> uriDurationMap = logs.map(LogLine::parseLine).collect(Collectors.groupingBy(LogLine::getUri,Collectors.averagingDouble(LogLine::getRequestDuration)));

从 map 中排序和过滤

    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());

关于Java 流处理顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40461749/

相关文章:

java - JCEF - Java 运行时环境检测到 fatal error

java - 如何在 Activity 中使用其他类的方法

java - 两者有什么区别?

javascript - 使用 lodash .groupBy。如何为分组输出添加自己的键?

java - 确定高尔夫球座顺序函数 Java

java - 有没有办法在Java中一个类的所有方法之前和之后始终执行一个函数?

Java反射的缺点——性能开销

algorithm - 这个快速排序实现的错误是什么?

java流收集函数给出错误

java - 重做 foreach 到 .stream().map