关于map函数的方法参考,当键的类型为String时编译错误

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于map函数的方法参考,当键的类型为String时编译错误相关的知识,希望对你有一定的参考价值。

语境:

我想在computeIfAbsent上使用Map函数。但是,当我使用时,我收到编译错误

  • 方法参考和关键是String

我使用时没有编译错误

  • 方法参考和关键是Integer
  • lambda和关键是String

插图:

以下陈述是合法的:

Map<Integer, List<Long>> map = new HashMap<>();
Integer key = Integer.valueOf(0);
Long value = Long.valueOf(2);
map.computeIfAbsent(key, ArrayList::new).add(value); // No compilation error

以下陈述是非法的:

Map<String, List<Long>> map = new HashMap<>();
String key = "myKey";
Long value = Long.valueOf(2);
map.computeIfAbsent(key, ArrayList::new).add(value); // Compilation error: The type ArrayList does not define ArrayList(String) that is applicable here

以下陈述是合法的:

Map<String, List<Long>> map = new HashMap<>();
String key = "myKey";
Long value = Long.valueOf(2);
map.computeIfAbsent(key, x -> new ArrayList<>()).add(value); // No compilation error

问题:我不明白为什么当与方法参考结合时,String作为关键是特殊的。任何的想法?

答案

当你调用ArrayList::new而不是x -> new ArrayList<>()时,它等于调用x -> new ArrayList<>(x)

方法computeIfAbsent需要lambda表达式,其中一个lambda参数作为第二个输入参数,或者对使用String类型的一个参数的方法的引用。

你的错误

编译错误:类型ArrayList未定义此处适用的ArrayList(String)

正在谈论:you trying to call constructor with one String argument。因为,正如我上面所说,lambda x -> someObject.method(x)等于someObject::method。或者lambda x -> new SomeClass(x)等于SomeClass::new

你不能在这里使用方法(构造函数)引用,因为这里需要使用一个参数或一个lambda表达式的方法(构造函数)。如果有lambda没有任何参数,你将能够调用空构造函数。

以上是关于关于map函数的方法参考,当键的类型为String时编译错误的主要内容,如果未能解决你的问题,请参考以下文章

当键是一个只知道第一个元素的元组时,如何获取scala Map值?

在普通键的情况下使用map over unordered_map有什么好处吗?

当键的数量少于每个键的值的数量时,PySpark reduceByKey 会继续失败

当键的名称中有点时(在 oracle 中),我如何访问 JSON 值?

c++ map 的key可是是一个类吗

关于Map泛型问题?我想取出的value为任意类型,不用类型转换?