Java流式处理流程

时间:2016-11-07 09:28:24

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

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

这就是我要做的事情:

  1. 逐行阅读文件
  2. 在这些行中映射键
  3. 按1键合并行(下面的代码中的getUri)和(获取另一个键的平均值(getRequestDuration))
  4. 按平均合并的getRequestDuration(最高的第一个)
  5. 排序
  6. 返回最高金额。
  7. 这就是我现在所得到的:

    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. 如何正确限制?因此,它限制了我返回的条目数量,而不是我经历的数量。
    3. 我(我想)了解溪流是如何工作的,但是我在将它用于现实世界时遇到了麻烦。 我不一定要找到我面临的问题的完整代码,而不是那些能够提供理解如何操作所需信息的人。如果有人写出如何以正确的方式解决这些问题,我将非常感激。

1 个答案:

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