Java流进程顺序

Java流进程顺序,java,sorting,java-8,java-stream,collectors,Java,Sorting,Java 8,Java Stream,Collectors,我相信对我来说,一步一步地写下我要做的事情,并复制到目前为止的代码,而不是试图用一篇长的文本来解释它,会更容易 这就是我要做的: 逐行读取文件 在这些行中映射关键点 按1键(下面代码中的getUri)和(获取另一个键的平均值(getRequestDuration))合并行 按合并getRequestDuration的平均值排序(最高优先) 返回n个最高值 这就是我现在得到的: try(Stream<String> logs = Files.lines(Paths.get(args))

我相信对我来说,一步一步地写下我要做的事情,并复制到目前为止的代码,而不是试图用一篇长的文本来解释它,会更容易

这就是我要做的:

  • 逐行读取文件
  • 在这些行中映射关键点
  • 按1键(下面代码中的getUri)和(获取另一个键的平均值(getRequestDuration))合并行
  • 按合并getRequestDuration的平均值排序(最高优先)
  • 返回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;
    
    try(流日志=Files.line(path.get(args)){
    logs.map(LogLine::parseLine).limit(10).sorted((e1,e2)->Integer.compare(e1.getRequestDuration(),1),
    e2.getRequestDuration())
    .collect(收集器.groupingBy(
    LogLine::getUri,
    收集器.averagingDouble(LogLine::getRequestDuration));
    返回日志;
    
    我是Java新手,所以我有几个问题希望有人能回答我:

  • 收集后如何排序/排序前如何分组
  • 如何正确地限制?这样它就限制了我返回的条目数量,而不是我通过的条目数量
  • 我(想我)了解流是如何工作的,但我很难将其用于现实世界。
    我不一定是在寻找我所面临问题的完整代码,而不是那些能为我提供理解如何做到这一点所需信息的人。如果有人能写出如何以正确的方式使用流解决此类问题,我将不胜感激。

    您可以在下面尝试,按URI分组,并将平均持续时间作为值,从结果映射按值排序并限制预期结果的数量

        Map<String, Double> uriDurationMap = logs.map(LogLine::parseLine).collect(Collectors.groupingBy(LogLine::getUri,Collectors.averagingDouble(LogLine::getRequestDuration)));
    
    如果只需要值

        List<Double> filteredList = uriDurationMap.values().stream().sorted().limit(10).collect(Collectors.toList());
    
    List filteredList=uriDurationMap.values().stream().sorted().limit(10.collector.toList());
    
    您可以在下面尝试,从结果映射中按URI分组,并将平均持续时间作为值进行排序,并限制预期结果的数量

        Map<String, Double> uriDurationMap = logs.map(LogLine::parseLine).collect(Collectors.groupingBy(LogLine::getUri,Collectors.averagingDouble(LogLine::getRequestDuration)));
    
    如果只需要值

        List<Double> filteredList = uriDurationMap.values().stream().sorted().limit(10).collect(Collectors.toList());
    
    List filteredList=uriDurationMap.values().stream().sorted().limit(10.collector.toList());
    
    代替
    比较器。比较(Map.Entry::getValue)
    ,你可以使用
    Map.Entry.comparingByValue()
    @Holger哦,我不知道这个增强,谢谢你代替
    比较器。比较(Map.Entry::getValue)
    ,你可以使用
    Map.Entry.comparingByValue()
    @Holger哦,我不知道这个增强功能,谢谢