无法从Collectors.toMap中的静态上下文引用非静态方法

时间:2018-07-31 13:14:22

标签: java java-stream

我有一个要转换为Map<String, Integer>的学生列表,其中的地图关键字应为该学生的名字。为了简化代码示例,我将映射值指定为1

final Map<String, Integer> map = someStudents.stream().collect(
        Collectors.toMap(Student::getFirstName, 1));

编译器抱怨:

  

不能从静态上下文中引用非静态方法getFirstName()

有什么主意吗?我很困惑,因为许多示例都使用将引用传递给非静态方法的相同方法。为什么编译器在这里看到静态上下文?

2 个答案:

答案 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(好像它是一个静态成员)而不是使用对象引用来访问StudentJava tutorial - Method Refrences
其次,toMap方法的第二个参数必须是Function类型。

因此,正确的陈述是:
someStudents.stream().collect( Collectors.toMap( student -> student.getFirstName(), student -> 1 ) );

修改:
或者,也可以是@Aomine发布的内容。两个答案都是正确的。有关更多信息,请参阅有关@Aomine答案的评论。

编辑2:
不过,@ Aomine和这个答案给出了预期的结果,请注意第一个参数的差异。