【问题标题】:Java streams order of processesJava 流式处理进程的顺序
【发布时间】:2017-03-20 14:15:28
【问题描述】:

我相信我只需要一步一步地写下我必须做的事情并复制我到目前为止的代码而不是试图用长篇大论解释它会更容易。

这是我必须做的:

  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. 如何正确限制?这样它就限制了我返回的条目数量,而不是我经历的条目数量。

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

【问题讨论】:

    标签: java sorting java-8 java-stream collectors


    【解决方案1】:

    您可以在下面尝试,按 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());
    

    【讨论】:

    • 你可以用Comparator.comparing(Map.Entry::getValue)代替Map.Entry.comparingByValue()
    • @Holger 哦,我不知道这个增强,谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多