为什么 Map.entry::getKey 和 Map.entry::getValue 在对流中的 hashmap 进行排序时不起作用?

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

我正在尝试使用流对 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
但是我在网站上看到了同样的例子。也许有人明白错误是什么?

java sorting
3个回答
1
投票

要修复错误,请更改原始参数

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 替换原则,您应该尽可能使用抽象类型。

我没有深入研究过,但我怀疑你遇到了与合成方法的无意匹配。

当您使用原始类型时,泛型有一些奇怪的方面,这是应该避免的。


1
投票

将方法的参数从

Map map
替换为
Map<String, Integer> map
,它将正常工作。目前您的地图通用类型不匹配。

或者如果你想让它更通用,那么你可以这样做:

public <S, T extends Comparable<T>>LinkedHashMap<S, T> sort(Map<S, T> map) {


0
投票

补充一点 - 如果 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
            ))
        );
© www.soinside.com 2019 - 2024. All rights reserved.