静态上下文无法访问收集器中的非静态

我有一群学生。首先,我想按标记对它们进行分组。然后我想进一步将这些集合分组为同名学生。

Map<Integer,Map<String,List<String>>> groupping = students.stream()
                                                    .collect(Collectors.groupingBy(Student::getMarks, 
                                                            Collectors.mapping(Student::getName,Collectors.toList())));

我得到一个错误说,

不能从静态上下文中引用非静态方法。

是的。我非常清楚,如果没有实例,我就不能引用非静态方法。但是对于所有这些流操作,我对到底出了什么问题有点困惑。

而不是如何解决这个问题;我真的很想知道这里发生了什么。感谢您的任何意见!

因为如果我写下面的分组是完全有效的;

Map<Integer,List<Student>> m = students.stream().
        collect(Collectors.groupingBy(Student::getMarks));

这是我的学生.java课(如果你需要的话)

public class Student {
    private String name;
    private int marks;
    // getters, setters, constructor and toString
}

答案 1

遗憾的是,错误消息“无法从静态上下文中引用非静态方法”只是涉及方法引用时任何类型不匹配问题的占位符。编译器根本无法确定实际问题。

在代码中,目标类型与组合收集器的结果类型不匹配,即 ,但编译器没有尝试确定此(独立)结果类型,因为合并方法引用的(嵌套)泛型方法调用需要目标类型来解析方法引用。因此,它不会报告赋值的类型不匹配,而是在解析方法引用时出现问题。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())));

答案 2

我认为Holger已经很好地解释了这个错误,以及为什么它在一次运行中没有多大意义。

考虑到你的目标,我认为这是你需要有的解决方案。

 Map<Integer, Map<String, List<Student>>> grouping = students.stream().collect(Collectors.groupingBy(Student::getMarks,
                Collectors.groupingBy(Student::getName)));

这只会给你一个学生列表,首先按分数分组,然后按姓名分组。:))


推荐