生徒をグループ分けするプログラムのなかでMap
インターフェースの引数を以下のように入れ替えてみたところ「引数の型が合わない」とエラーになりました。
Map<List<Student>, Integer>
// エラー
これはなぜでしょうか?ドキュメントを調べてみるとMap
インターフェースの引数はMap<K, V>
と書いてありました。実際に利用する場合はMap<Integer, String>
だったりMap<String, Integer>
だったりと多様性があるはずと記憶していたのでエラーの原因がわかりません。
=
は右辺から評価すると考えると右辺に相当するのはstudents.stream().collect(Collectors.groupingBy(Student::getScore));
です。キーに生徒のList、値に点数を入れたMAP
を作る目的はありませんが「なぜエラーになるのか」の仕組みを知りたいです。
アドバイスのほど、よろしくお願いいたします。
#追記
エラーコードはEclipse内で引数を入れ替えたときに赤い下線が表示されました。内容は以下です。
スレッド [main] (中断中 (型の不一致: Map<Integer,List<Student>> から Map<List<Student>,Integer> には変換できません)) Main.testStream() 行: 21 Main.main(String[]) 行: 11 ``` 追記終了 --- ```Java class Student { private String name; private int score; public Student(String name, int score) { this.name = name; this.score = score; } public String getName() { return name; } public int getScore() { return score; } @Override public String toString() { return name + ":" + score; } } ``` ```Java public static void main(String[] args) { List<Student> students = new ArrayList<>(); students.add(new Student("Ken", 100)); students.add(new Student("Shin", 60)); students.add(new Student("Takuya", 80)); students.add(new Student("Sakamoto", 100)); Map<Integer, List<Student>> map = students.stream() .collect(Collectors.groupingBy(Student::getScore)); System.out.println(map); } ``` 出力結果 ```Java {80=[Takuya:80], 100=[Ken:100, Sakamoto:100], 60=[Shin:60]} ```
回答3件
あなたの回答
tips
プレビュー