Предполагая следующий минимальный класс:
class Student {
String teachersName;
public String getTeachersName() {
return teachersName;
}
}
Вы можете обращаться к своему коду, сопоставляя возвращаемые типы на каждом шаге.Например, подпись для groupingBy
имеет вид:
// <T, K> Collector<T, ?, Map<K, List<T>>> groupingBy(Function<? super T, ? extends K> classifier)
, а ваша конкретная реализация детализирована как:
Collectors.groupingBy(new Function<Student, String>() {
@Override
public String apply(Student student) {
return student.getTeachersName();
}
})
, которая в вашем случае возвращает
Collector<Student, ?, Map<String, List<Student>>>
и далее, если вы посмотрите на сигнатуру операции collect
, то есть
// <R, A> R collect(Collector<? super T, A, R> collector)
, тем самым в вашем случае вы получите R
как:
Map<String, List<Student>>