Java 映射函数上的方法引用,当键的类型为String时出现编译错误
上下文: 我想在Java 映射函数上的方法引用,当键的类型为String时出现编译错误,java,lambda,compiler-errors,hashmap,method-reference,Java,Lambda,Compiler Errors,Hashmap,Method Reference,上下文: 我想在地图上使用函数computeIfAbsent。但是,当我使用 方法引用,键是字符串 当我使用 方法引用,键是一个整数 lambda和键是一个字符串 插图: 以下声明是合法的: Map Map=newhashmap(); 整数键=整数。值为(0); Long值=Long.valueOf(2); map.computeIfAbsent(key,ArrayList::new).add(value);//没有编译错误 以下声明是非法的: Map Map=newhashmap()
地图上使用函数computeIfAbsent
。但是,当我使用
- 方法引用,键是
字符串
当我使用
- 方法引用,键是一个
整数
- lambda和键是一个
字符串
插图:
以下声明是合法的:
Map Map=newhashmap();
整数键=整数。值为(0);
Long值=Long.valueOf(2);
map.computeIfAbsent(key,ArrayList::new).add(value);//没有编译错误
以下声明是非法的:
Map Map=newhashmap();
String key=“myKey”;
Long值=Long.valueOf(2);
map.computeIfAbsent(key,ArrayList::new).add(value);//编译错误:类型ArrayList未定义此处适用的ArrayList(字符串)
以下声明是合法的:
Map Map=newhashmap();
String key=“myKey”;
Long值=Long.valueOf(2);
map.computeIfAbsent(key,x->newArrayList()).add(value);//没有编译错误
问题:
我不明白为什么一个字符串
作为键在与方法引用结合时那么特殊。有什么想法吗?当你调用ArrayList::new
而不是x->new ArrayList()
它等于调用x->new ArrayList(x)
方法computeIfAbsent
需要一个lambda参数作为第二个输入参数的lambda表达式,或者对使用一个String
类型参数的方法的引用
你的错误
编译错误:类型ArrayList未定义此处适用的ArrayList(字符串)
正在讲话:您试图用一个字符串参数调用构造函数
。因为,正如我上面所说,lambdax->someObject.method(x)
等于someObject::method
。或者lambdax->newsomeclass(x)
等于SomeClass::new
这里不能使用方法(构造函数)引用,因为这里需要使用一个参数或lambda表达式的方法(构造函数)。如果存在没有任何参数的lambda,则可以调用空构造函数。您的回答给了我需要的提示:在ArrayList类中,只有以下构造函数:ArrayList(),ArrayList(Collection@KeyMaker00嗯……我告诉过你,你使用的方法引用并不需要:)我试图解释错误是什么。如果答案令你满意,请将其标记为正确。德国劳埃德船级社:)
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