Статический контекст не может получить доступ к нестатическому в Collectors
У меня есть группа студентов. Сначала я хочу сгруппировать их по отметкам. Затем я хочу объединить эти наборы в одноименные ученики вместе.
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));
Вот мой класс Student.java (если вам это нужно)
public class Student {
private String name;
private int marks;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getMarks() {
return marks;
}
public void setMarks(int marks) {
this.marks = marks;
}
public Student(String name, int marks) {
this.name = name;
this.marks = marks;
}
@Override
public String toString() {
return name + ':' + marks ;
}
}
2 ответа
К сожалению, сообщение об ошибке "Нестатический метод не может быть вызван из статического контекста". Это просто заполнитель для любой проблемы несоответствия типов, когда используются ссылки на методы. Компилятор просто не смог определить актуальную проблему.
В вашем коде тип цели 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())));
Я думаю, что Хольгер дал хорошее объяснение об ошибке и почему она не имеет большого смысла за один прогон.
Учитывая вашу цель, я думаю, что это решение, которое вам нужно иметь.
Map<Integer, Map<String, List<Student>>> grouping = students.stream().collect(Collectors.groupingBy(Student::getMarks,
Collectors.groupingBy(Student::getName)));
Это просто даст вам список студентов, сначала сгруппированных по оценкам, а затем по имени.:))