Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 此处不需要方法引用表达式,编译时错误_Java_List_Lambda_Hashmap_Java Stream - Fatal编程技术网

Java 此处不需要方法引用表达式,编译时错误

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

我正在使用stream对列表进行迭代,并希望在映射中收集列表,但出现编译时错误:

此处不需要方法引用表达式

这是我的密码

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中预期字符串输出的方式相同,然后应用串联。现在我明白了。