【问题标题】:Why is map stream sorted after filtering not working?为什么过滤后地图流排序不起作用?
【发布时间】:2021-11-09 19:27:42
【问题描述】:

我有Map<String,Integer> map。我想通过按键对地图进行过滤和排序,然后得到他们数量的5%,我有这样一个功能:

public List<String> getValuableSubStr(){
        List<String> result = new ArrayList<>();
        long size = map.entrySet().stream().filter(e -> e.getKey().length() ==3).count();
        map.entrySet().stream()
                      .filter(e -> e.getKey().length() ==3)
                      .sorted(Map.Entry.<String,Integer>comparingByKey().reversed())
                      .limit((size*5)/100)
                      .peek(e -> result.add(e.getKey()));
        return result;

    }

但是调用该函数后,我得到一个空列表,虽然地图不是空的,forEach 打印正常。我做错了什么?

【问题讨论】:

    标签: java stream


    【解决方案1】:

    peek 不是终端操作,因此不会导致流被评估。

    使用forEach 而不是peek

    或者,更好的是,直接收集到一个列表中。

    return map.entrySet().stream()
        .filter(e -> e.getKey().length() ==3)
        .sorted(Map.Entry.<String,Integer>comparingByKey().reversed())
        .limit((size*5)/100)
        .map(Map.Entry::getKey)
        .collect(Collectors.toList());
    

    实际上,因为您只处理键:

    return map.keySet().stream()
        .filter(e -> e.length() ==3)
        .sorted(Comparator.reverseOrder())
        .limit((size*5)/100)
        .collect(Collectors.toList());
    

    【讨论】:

      【解决方案2】:

      peek 对于调试更有用。见这里:

      这是一个中间操作,我们没有应用终端操作

      来自https://www.baeldung.com/java-streams-peek-api

      我愿意

      public List<String> getValuableSubStr(){
          List<String> result = new ArrayList<>();
          long size = map.entrySet().stream().filter(e -> e.getKey().length() ==3).count();
          return map.entrySet().stream()
                        .filter(e -> e.getKey().length() ==3)
                        .sorted(Map.Entry.<String,Integer>comparingByKey().reversed())
                        .limit((size*5)/100)
                        .map(a -> a.getKey())
                        .collect(Collectors.toList());
      
      }
      

      【讨论】:

        猜你喜欢
        • 2017-09-14
        • 1970-01-01
        • 2023-01-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-04-11
        相关资源
        最近更新 更多