java - 这里不需要方法引用表达式,编译时错误

标签 java list lambda hashmap java-stream

我正在使用流来迭代列表,并希望将其收集在 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/

相关文章:

java - 我的 Swing 应用程序中的数据库连接错误为强制转换为语句

python - 从 Pandas 列表中获取值(value)

mysql - 将一个MYSQL字符串从GROUP_CONCAT拆分成一个IN()可以理解的(array,like,expression,list)

用于 BFS 遍历的 C++ Lambda 函数

c++ - 在 Lambda 捕获中构建 intializer_list<string>

java - 我的Mediaplayer一次卡住了

java - jfree 图表示例教程

c++ - std::vector 或 std::list 用于 std::unordered_map 存储桶?

c++ - Lambda 中的参数列表

java - Hibernate 不在 JBoss 7.1.1 的 H2 中保存数据