我有一个要转换为Map<String, Integer>
的学生列表,其中的地图关键字应为该学生的名字。为了简化代码示例,我将映射值指定为1
:
final Map<String, Integer> map = someStudents.stream().collect(
Collectors.toMap(Student::getFirstName, 1));
编译器抱怨:
不能从静态上下文中引用非静态方法getFirstName()
有什么主意吗?我很困惑,因为许多示例都使用将引用传递给非静态方法的相同方法。为什么编译器在这里看到静态上下文?
答案 0 :(得分:3)
The value mapper should be a function,即:
.collect(Collectors.toMap(Student::getFirstName, s -> 1));
函数s -> 1
本质上是将一个学生作为输入,并在此特定情况下为地图值返回1
。
以下代码无效,因为文字值1
不是函数。
.collect(Collectors.toMap(Student::getFirstName, 1));
答案 1 :(得分:1)
首先,您使用类名-getFirstName
(好像它是一个静态成员)而不是使用对象引用来访问Student
。 Java tutorial - Method Refrences。
其次,toMap
方法的第二个参数必须是Function
类型。
因此,正确的陈述是:
someStudents.stream().collect( Collectors.toMap( student -> student.getFirstName(), student -> 1 ) );
修改:
或者,也可以是@Aomine发布的内容。两个答案都是正确的。有关更多信息,请参阅有关@Aomine答案的评论。
编辑2:
不过,@ Aomine和这个答案给出了预期的结果,请注意第一个参数的差异。