我正在使用流来迭代列表,并希望将其收集在 map 中,但出现编译时错误:
Method reference expression is not expected here
这是我的代码
List<Person> personList = getPersons();
Map<String, Integer> personAgeMap = personList.stream()
.collect(Collectors.toMap(Person::getFirstName + "_" + Person::getLastName, Person::getAge));
我已经检查了这些答案:
但这些不是我要找的,我也看到了方法引用类型。
在这种情况下,它是实例类型的实例方法,我如何在收集器中拥有 Person 的实例。
可能的解决方案是什么,或者这种方式是否可行?
最佳答案
你不能这样做,这没有意义:
Collectors.toMap(Person::getFirstName + "_" + Person::getLastName
您需要了解toMap方法的签名是什么。为了简单起见,我们假设它是:
void toMap(Function<? super T,? extends K> keyMapper)
你看到了吗? keyMapper 是 Function 类型的对象。该函数接受输入(一个 Person)并返回一个输出(一个 String)。所以你需要提供一个函数来做到这一点。如果你写
Person::getFirstName + "_" + Person::getLastName
那就是……好吧,没什么,但我们可以说在最坏的情况下它可能是一个字符串。因为你用一个字符串连接 3 个东西。这不是一个函数。您想要的是创建一个函数。
所以你可以这样做:
Collectors.toMap(new Function<Person, String>() {
public String apply(Person person) {
return person.getFirstName() + "_" + person.getLastName();
}
});
简写为:
Collectors.toMap(person -> person.getFirstName() + "_" + person.getLastName()
关于java - 这里不需要方法引用表达式,编译时错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62486225/