为什么地图流过滤后排序不起作用?

问题描述 投票:0回答:2

我有

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 java-stream
2个回答
3
投票

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

0
投票

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

}
© www.soinside.com 2019 - 2024. All rights reserved.