Java 8 Lambda,过滤HashMap,无法解决方法

22

我对Java 8的新特性还不太熟悉。我正在学习如何按条目过滤地图。我已经查看了这篇教程这个帖子来解决我的问题,但是我无法解决。

@Test
public void testSomething() throws Exception {
    HashMap<String, Integer> map = new HashMap<>();
    map.put("1", 1);
    map.put("2", 2);
    map = map.entrySet()
            .parallelStream()
            .filter(e -> e.getValue()>1)
            .collect(Collectors.toMap(e->e.getKey(), e->e.getValue()));
}

然而,我的IDE(IntelliJ)显示“无法解析方法'getKey()'”,因此无法编译: enter image description here

这也没有帮助: enter image description here
有人能帮我解决这个问题吗? 谢谢。


如果我可以问一下... e 究竟是什么.. 我没有看到它在任何地方被声明过.. - Zuko
@tobias_k,关于泛型应该不是问题。根据这个链接,它应该可以正常工作:http://www.leveluplunch.com/java/examples/filter-map-by-value/ - Daniel
1
@FlorentBayle 加上强制类型转换 (HashMap<String, Integer>) 会有帮助! - Daniel
2个回答

34

这条信息有误导性,但您的代码不能编译还有一个原因:collect返回的是Map<String, Integer>而不是 HashMap

如果您使用

Map<String, Integer> map = new HashMap<>();

它应该按预期工作(还要确保您具有所有相关的导入)。


2
显然编译器需要 一些 时间才能聪明到错误的真正原因。目前相当令人沮丧... - Marko Topolnik
如果我们通过 (HashMap<String, Integer>) 对 .collect 返回的内容进行向下转型,似乎是可以工作的。但是在转型方面是否存在任何问题呢? - Daniel
我个人总是更喜欢从接口中生成数据结构,如List、Map等。 - Zuko
@Daniel 收集器不会对返回的类型提供任何保证 - 所以它现在可能有效,但将来可能会出现问题。 - assylias
这个简单的解决方案真是救了我的一天。之前我用了 toSet() 而不是正确的 toList() 。这个错误信息确实非常令人困惑,让人误解了。而且有些误导性。 - Bhushan

5
您返回的是Map而不是HashMap,因此需要将map类型更改为java.util.Map。此外,您可以使用方法引用而不是调用getKey,getValue。例如:
Map<String, Integer> map = new HashMap<>();
        map.put("1", 1);
        map.put("2", 2);
        map = map.entrySet()
                .parallelStream()
                .filter(e -> e.getValue() > 1)
                .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));

您可以使用一些Intellij的帮助来解决它,例如如果您在 ctrl+alt+v 前按下,则可以解决该问题。
new HashMap<>();
            map.put("1", 1);
            map.put("2", 2);
            map = map.entrySet()
                    .parallelStream()
                    .filter(e -> e.getValue() > 1)
                    .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));

由IntelliJ创建的变量将是确切的类型,您将得到该类型的变量。
Map<String, Integer> collect = map.entrySet()
        .parallelStream()
        .filter(e -> e.getValue() > 1)
        .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));

ctrl+alt+v 真是太棒了。 - Daniel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接