【问题标题】:Java 8 Lambda, filter HashMap, cannot resolve methodJava 8 Lambda,过滤器HashMap,无法解析方法
【发布时间】:2015-01-08 21:40:59
【问题描述】:

我对 Java 8 的新功能有点陌生。我正在学习如何按条目过滤地图。我已经查看了this tutorialthis post 的问题,但我无法解决。

@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()'”,因此无法编译:

这也无济于事:
谁能帮我解决这个问题? 谢谢。

【问题讨论】:

  • 如果我可以问.. e 到底是什么.. 没有看到它在任何地方声明..
  • @tobias_k,关于泛型应该不是问题。它应该根据这个leveluplunch.com/java/examples/filter-map-by-value工作
  • @FlorentBayle 添加强制转换 (HashMap) 有帮助!

标签: java lambda


【解决方案1】:

该消息具有误导性,但您的代码由于其他原因无法编译:collect 返回 Map&lt;String, Integer&gt; 而不是 HashMap

如果你使用

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

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

【讨论】:

  • 显然编译器需要 一些 时间才能足够聪明地了解错误的真正原因。目前很沮丧...
  • 如果我们将 .collect 返回的内容向下转换为 (HashMap),它似乎可以工作。但是选角有什么问题吗?
  • 我总是喜欢从接口、List、Map 等生成数据结构
  • @Daniel 收集器不对返回的类型提供任何保证 - 所以它现在可能工作,将来可能会中断。
  • The message is misleading:这拯救了我的一天。我使用的是toSet(),我应该使用toList()。消息确实很混乱。
【解决方案2】:

您返回的是 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 太棒了
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-01
  • 1970-01-01
  • 2019-05-15
相关资源
最近更新 更多