Java 此处不需要方法引用表达式,编译时错误
我正在使用stream对列表进行迭代,并希望在映射中收集列表,但出现编译时错误: 此处不需要方法引用表达式 这是我的密码Java 此处不需要方法引用表达式,编译时错误,java,list,lambda,hashmap,java-stream,Java,List,Lambda,Hashmap,Java Stream,我正在使用stream对列表进行迭代,并希望在映射中收集列表,但出现编译时错误: 此处不需要方法引用表达式 这是我的密码 List<Person> personList = getPersons(); Map<String, Integer> personAgeMap = personList.stream() .collect(Collectors.toMap(Person::getFirstName + "_" + Person::g
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)
那就是。。。好吧,没什么,但假设在最坏的情况下,它可能是一个字符串。因为你用一个字符串连接了3个东西。这不是一个函数。您想要的是创建一个函数
所以你可以这样做:
Collectors.toMap(new Function<Person, String>() {
public String apply(Person person) {
return person.getFirstName() + "_" + person.getLastName();
}
});
你不能这样做,这毫无意义:
Collectors.toMap(Person::getFirstName + "_" + Person::getLastName
您需要了解toMap方法的签名是什么。为了简单起见,我们可以这样说:
void toMap(Function<? super T,? extends K> keyMapper)
那就是。。。好吧,没什么,但假设在最坏的情况下,它可能是一个字符串。因为你用一个字符串连接了3个东西。这不是一个函数。您想要的是创建一个函数
所以你可以这样做:
Collectors.toMap(new Function<Person, String>() {
public String apply(Person person) {
return person.getFirstName() + "_" + person.getLastName();
}
});
这里不能使用方法引用。试试lambda
Collectors.toMap(
p -> String.format("%s_%s", p.getFirstName(), p.getLastName()),
Person::getAge
)
Person::getFirstName和Person::getLastName都是某些函数接口的实例,而这些接口从来都不是字符串,例如Supplier或Function,运算符+不能应用于它们
同样,如果你是,这也没有多大意义
Object o = new Object() + new Object();
让你有点困惑
p -> ((Function<Person, String>) Person::getFirstName).apply(p) + "_" +
((Function<Person, String>) Person::getLastName).apply(p)
这里不能使用方法引用。试试lambda
Collectors.toMap(
p -> String.format("%s_%s", p.getFirstName(), p.getLastName()),
Person::getAge
)
Person::getFirstName和Person::getLastName都是某些函数接口的实例,而这些接口从来都不是字符串,例如Supplier或Function,运算符+不能应用于它们
同样,如果你是,这也没有多大意义
Object o = new Object() + new Object();
让你有点困惑
p -> ((Function<Person, String>) Person::getFirstName).apply(p) + "_" +
((Function<Person, String>) Person::getLastName).apply(p)
方法引用用于引用lambda中的方法。它不调用该方法,而是提供对lambda的引用 这意味着您不能以调用方法的相同方式使用方法引用,因此Person::getFirstName+u+Person::getLastName不正确 因此,为了得到想要的结果,可以使用基本的lambda表达式,如下所示: List personList=getPersons; Map personAgeMap=personList.stream .collectCollectors.toMapperson->person.getFirstName+u+person.getLastName,person::getAge;
希望我有用。方法引用用于引用lambda中的方法。它不调用该方法,而是提供对lambda的引用 这意味着您不能以调用方法的相同方式使用方法引用,因此Person::getFirstName+u+Person::getLastName不正确 因此,为了得到想要的结果,可以使用基本的lambda表达式,如下所示: List personList=getPersons; Map personAgeMap=personList.stream .collectCollectors.toMapperson->person.getFirstName+u+person.getLastName,person::getAge;
希望我有用。Person::getFirstName+\u+Person::getLastName是无效语法,我想,你不能将方法引用连接到stringsPerson::getFirstName+\u+Person::getLastName是无效语法,我想,你不能将方法引用连接到Strings,你说的是对的,但我认为我们从Person::getAge语句中预期年龄的方式与我从Person::getFirstName和Person::getLastName中预期字符串输出的方式相同,然后应用串联。现在我明白了。你说的是对的,但我认为我们从Person::getAge语句中预期年龄的方式与我从Person::getFirstName和Person::getLastName中预期字符串输出的方式相同,然后应用串联。现在我明白了。