静态上下文无法访问收集器中的非静态
Static context cannot access non-static in Collectors
我有一群学生。首先,我想按标记对它们进行分组。然后我想进一步将这些集合分组到同名学生中。
Map<Integer,Map<String,List<String>>> groupping = students.stream()
.collect(Collectors.groupingBy(Student::getMarks,
Collectors.mapping(Student::getName,Collectors.toList())));
我收到一条错误消息,
Non-static method cannot be refered from a static context.
是的。我非常清楚我不能在没有实例的情况下引用非静态方法。但是对于所有这些流操作,我对真正出错的地方有点困惑。
而不是如何解决这个问题;我真的很想知道这里发生了什么。感谢您的任何意见!
因为如果我写下面的分组是完全有效的;
Map<Integer,List<Student>> m = students.stream().
collect(Collectors.groupingBy(Student::getMarks));
这是我的Student.javaclass(以备不时之需)
public class Student {
private String name;
private int marks;
// getters, setters, constructor and toString
}
不幸的是,错误消息“无法从静态上下文中引用非静态方法。”当涉及方法引用时,它只是任何类型不匹配问题的占位符。编译器根本无法确定实际问题。
在您的代码中,目标类型 Map<Integer, Map<String, List<String>>>
与组合收集器的结果类型 Map<Integer, List<String>>
不匹配,但编译器并未尝试确定这一点(独立) 结果类型,因为包含方法引用的(嵌套)泛型方法调用需要目标类型来解析方法引用。所以它不会报告分配的类型不匹配,而是解决方法引用的问题。
正确的代码是
Map<Integer, List<String>> groupping = students.stream()
.collect(Collectors.groupingBy(Student::getMarks,
Collectors.mapping(Student::getName, Collectors.toList())));
我认为 Holger 对这个错误给出了很好的解释,以及为什么它在一个 运行.
中没有多大意义
考虑到您的目标,我认为这是您需要的解决方案。
Map<Integer, Map<String, List<Student>>> grouping = students.stream().collect(Collectors.groupingBy(Student::getMarks,
Collectors.groupingBy(Student::getName)));
这只会为您提供一个首先按分数分组,然后按姓名分组的学生列表。 :))
我有一群学生。首先,我想按标记对它们进行分组。然后我想进一步将这些集合分组到同名学生中。
Map<Integer,Map<String,List<String>>> groupping = students.stream()
.collect(Collectors.groupingBy(Student::getMarks,
Collectors.mapping(Student::getName,Collectors.toList())));
我收到一条错误消息,
Non-static method cannot be refered from a static context.
是的。我非常清楚我不能在没有实例的情况下引用非静态方法。但是对于所有这些流操作,我对真正出错的地方有点困惑。
而不是如何解决这个问题;我真的很想知道这里发生了什么。感谢您的任何意见!
因为如果我写下面的分组是完全有效的;
Map<Integer,List<Student>> m = students.stream().
collect(Collectors.groupingBy(Student::getMarks));
这是我的Student.javaclass(以备不时之需)
public class Student {
private String name;
private int marks;
// getters, setters, constructor and toString
}
不幸的是,错误消息“无法从静态上下文中引用非静态方法。”当涉及方法引用时,它只是任何类型不匹配问题的占位符。编译器根本无法确定实际问题。
在您的代码中,目标类型 Map<Integer, Map<String, List<String>>>
与组合收集器的结果类型 Map<Integer, List<String>>
不匹配,但编译器并未尝试确定这一点(独立) 结果类型,因为包含方法引用的(嵌套)泛型方法调用需要目标类型来解析方法引用。所以它不会报告分配的类型不匹配,而是解决方法引用的问题。
正确的代码是
Map<Integer, List<String>> groupping = students.stream()
.collect(Collectors.groupingBy(Student::getMarks,
Collectors.mapping(Student::getName, Collectors.toList())));
我认为 Holger 对这个错误给出了很好的解释,以及为什么它在一个 运行.
中没有多大意义考虑到您的目标,我认为这是您需要的解决方案。
Map<Integer, Map<String, List<Student>>> grouping = students.stream().collect(Collectors.groupingBy(Student::getMarks,
Collectors.groupingBy(Student::getName)));
这只会为您提供一个首先按分数分组,然后按姓名分组的学生列表。 :))