我有
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
正常打印。我做错了什么?
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());
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());
}