web-dev-qa-db-ja.com

静的コンテキストはコレクターの非静的にアクセスできません

学生のグループがあります。まず、マークでグループ化します。次に、これらのセットを同じ名前の学生にさらにグループ化します。

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

残念ながら、「非静的メソッドは静的コンテキストから参照できません」というエラーメッセージは、メソッド参照が関係する場合の型の不一致の問題の単なるプレースホルダーです。コンパイラーは、実際の問題の特定に失敗しました。

コードでは、ターゲットタイプ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())));
48
Holger

ホルガーは、エラーについての良い説明と、一度の実行でそれがあまり意味をなさない理由を与えたと思います。

あなたの目標を考えると、これがあなたが必要とする解決策だと思います。

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

これにより、最初にマークでグループ化され、次に名前でグループ化された学生リストが表示されます。 :))

3