tutorial pass parameter method implement expressions baeldung java-8 java-stream method-reference collect

java 8 - pass - El contexto estático no puede acceder al no estático en los recopiladores



java-> (2)

Tengo grupo de alumnos. Primero quiero agruparlos por las marcas. Luego quiero agrupar más esos conjuntos en estudiantes del mismo nombre juntos.

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

Me sale un error diciendo:

El método no estático no puede ser referenciado desde un contexto estático.

Sí. Soy bastante consciente de que no puedo referir un método no estático sin tener una instancia. Pero con todas estas operaciones de flujo, estoy un poco confundido de lo que realmente salió mal.

En lugar de cómo solucionar esto; Tengo muchas ganas de saber qué está pasando aquí. Cualquiera de sus entradas son apreciadas!

Porque si escribo la siguiente agrupación es completamente válida;

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

Aquí está mi clase Student.java (en caso de que lo necesite)

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 ; } }


Creo que Holger ha dado una buena explicación sobre el error y por qué no tiene mucho sentido en una carrera.

Teniendo en cuenta su objetivo, creo que esta es la solución que necesita tener.

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

Esto simplemente le daría una lista de estudiantes primero agrupada por marcas, luego por nombre. :))


Desafortunadamente, el mensaje de error " No se puede hacer referencia al método no estático desde un contexto estático " es solo un marcador de posición para cualquier problema de falta de coincidencia de tipo, cuando se trata de referencias de métodos. El compilador simplemente no pudo determinar el problema real.

En su código, el tipo de destino Map<Integer, Map<String, List<String>>> Map<Integer, List<String>> no coincide con el tipo de resultado del recopilador combinado que es Map<Integer, List<String>> , pero el compilador no coincidió intente determinar este tipo de resultado (independiente), ya que las invocaciones de métodos genéricos (anidadas) que incorporan referencias de métodos requieren el tipo de destino para resolver las referencias de métodos. Por lo tanto, no informa una falta de coincidencia de tipo de la asignación, sino un problema con la resolución de las referencias del método.

El código correcto es simplemente

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