我正在尝试使用流对 HashMap 进行排序:
public class sortByValue implements Sorting{
@Override
public LinkedHashMap<String,Integer> sort(Map map) {
return map.entrySet().stream().
sorted(Map.Entry.comparingByValue()).
collect(Collectors.toMap(
Map.Entry::getKey,
Map.Entry::getValue,
(oldValue, newValue) -> oldValue, LinkedHashMap::new));
}
}
但是它给了我一个错误:
Non-static method cannot be referenced from a static context
就在功能上
Map.Entry::getKey,Map.Entry::getValue
但是我在网站上看到了同样的例子。也许有人明白错误是什么?
要修复错误,请更改原始参数
Map
Map map
输入
Map
:
Map<String, Integer> map
给予:
public Map<String, Integer> sort(Map<String, Integer> map) {
return map.entrySet().stream().
sorted(Map.Entry.comparingByValue()).
collect(Collectors.toMap(
Map.Entry::getKey,
Map.Entry::getValue,
(oldValue, newValue) -> oldValue, LinkedHashMap::new));
}
或者使其适用于任何地图类型:
public <K, V extends Comparable<V>> Map<K, V> sort(Map<K, V> map) {
请注意,返回类型不需要是
LinkedHashMap
。根据 Liskov 替换原则,您应该尽可能使用抽象类型。
我没有深入研究过,但我怀疑你遇到了与合成方法的无意匹配。
当您使用原始类型时,泛型有一些奇怪的方面,这是应该避免的。
将方法的参数从
Map map
替换为 Map<String, Integer> map
,它将正常工作。目前您的地图通用类型不匹配。
或者如果你想让它更通用,那么你可以这样做:
public <S, T extends Comparable<T>>LinkedHashMap<S, T> sort(Map<S, T> map) {
补充一点 - 如果 lambda 参数中有映射,也可能会出现此问题。您需要输入 lambda 参数,而不是回复隐式输入。当减少到如下所示的哈希图时,我遇到了这个问题:
map
.stream()
.reduce(
new HashMap<>(),
(a, b) -> { /* some reducer */}
/* The types below in the lambda function are needed! */
(final Map<Key, Integer> a, final Map<Key, Integer> b) -> Stream.of(a, b)
.flatMap(map -> map.entrySet().stream())
.collect(Collectors.toMap(
Map.Entry::getKey,
Map.Entry::getValue,
Integer::sum
))
);