【问题标题】:Map.merge .. non-static method cannot be referenced from static contextMap.merge .. 不能从静态上下文中引用非静态方法
【发布时间】:2019-05-21 20:22:51
【问题描述】:

我有以下代码:

    public List<String> myMethod(){
    ..
    ...... 
    Map<String, Module> m1 = new HashMap<>();
    Map<String, Module> m2= new HashMap<>();
    Set<Map.Entry<String, Module>> entries = m2.entrySet();
    for( Map.Entry<String, Module>  e : entries){
        m1.merge(e.getKey(),e.getValue(),String::concat);
        }
    .....
   }

我在这里得到错误行 String::concat 消息 non-static method cannot be referenced from static context

知道如何解决这个问题吗?

【问题讨论】:

  • merge 的第三个参数必须在 2 个Modules 中构成一个ModuleString::concat 不会那样做。
  • 如果你能告诉我们你想如何合并它们会容易得多
  • 我不确定,但是这个链接stackoverflow.com/questions/4299728/…呢?
  • 在我看来,您可能想要一个 Map&lt;String, String&gt; 作为基于两个现有地图的结果。在这种情况下,您可以使用Stream.concat(m1.entrySet().stream(), m2.entrySet().stream()) .collect(toMap(Map.Entry::getKey, e -&gt; e.getValue().getStrProp(), String::concat));Stream.concat(m1.entrySet().stream(), m2.entrySet().stream()) .collect(groupingBy(Map.Entry::getKey, mapping(e -&gt; e.getValue().getStrProp(), joining())));,否则下面的答案就足够了。最终,您可以更新您的帖子以使其更清晰。

标签: java java-8


【解决方案1】:

Map::mergeBiFunction 作为其最后一个参数来合并存在键冲突的值。

您需要找到一种方法来合并两个给定的Module's 而不是String

换句话说,就是:

 m1.merge(e.getKey(),e.getValue(),(Module l, Module r) -> ...);

另一方面,您可以将代码简化为:

m2.forEach((k, v) -> m1.merge(k, v, (Module l, Module r) -> ...));

【讨论】:

  • ... 和 toMap 具有合并功能是另一种方式。 m2.entrySet().stream().collect(toMap(e-&gt;e.getKey(),e-&gt;e.getValue(),(Module l, Module r) -&gt; ...))
  • @HadiJ 我认为你的意思是 Stream.concat(m1.entrySet().stream(), m2.entrySet().stream()) .collect(toMap(...)) 如果是这样,那么是的,我们可以这样做,但是每次都会构建一个新地图,而不是像 merge 那样修改现有地图。
【解决方案2】:

您的地图值是模块类型。 String::concat 返回一个字符串,你的第三个参数需要返回一个“合并”模块而不是 String::concat。

【讨论】:

  • @Eugene 那我需要删除我的吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-22
相关资源
最近更新 更多