web-dev-qa-db-fra.com

Le contexte statique ne peut pas accéder à des éléments non statiques dans les collecteurs

J'ai un groupe d'étudiants. Je veux d'abord les regrouper par les marques. Ensuite, je veux regrouper ces ensembles en étudiants du même nom.

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

Je reçois une erreur disant:

La méthode non statique ne peut pas être référencée à partir d'un contexte statique.

Oui. Je suis à peu près conscient que je ne peux pas référencer une méthode non statique sans avoir une instance. Mais avec toutes ces opérations de streaming, je suis un peu confus ce qui a vraiment mal tourné.

Plutôt que de savoir comment résoudre ce problème; Je veux vraiment savoir ce qui se passe ici. Toutes vos contributions sont appréciées!

Parce que si j'écris, le regroupement ci-dessous est complètement valide;

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

Voici ma classe Student.Java (au cas où vous en auriez besoin)

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 ;
    }
}
24
Jude Niroshan

Malheureusement, le message d'erreur "la méthode non statique ne peut pas être référencée à partir d'un contexte statique." N'est qu'un espace réservé pour tout problème de non-concordance de type, lorsque des références de méthode sont impliquées. Le compilateur n'a tout simplement pas réussi à déterminer le problème réel.

Dans votre code, le type cible Map<Integer, Map<String, List<String>>> ne correspond pas au type de résultat du collecteur combiné qui est Map<Integer, List<String>>, mais le compilateur n'a pas essayé de déterminer ce type de résultat (autonome), car les appels de méthode générique (imbriqués) incorporant des références de méthode nécessitent le type cible pour résoudre les références de méthode. Il ne signale donc pas une incompatibilité de type de l'affectation, mais un problème de résolution des références de méthode.

Le bon code est simplement

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

Je pense que Holger a donné une bonne explication sur l'erreur et pourquoi cela n'a pas beaucoup de sens en une seule fois.

Compte tenu de votre objectif, je pense que c'est la solution que vous devez avoir.

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

Cela vous donnerait simplement une liste d'étudiants d'abord groupée par notes, puis par nom. :))

3
Supun Wijerathne