Объяснение Java 8 Collector Интерфейс / Подпись метода - PullRequest
5 голосов
/ 11 мая 2019

Согласно Java 8 Docs

Модификатор и тип:

<R,A> R 

Метод и описание:

collect(Collector<? super T,A,R> collector)
Performs a mutable reduction operation on the elements of this stream using a Collector.

Модификатор и тип:

static <T,K> Collector<T,?,Map<K,List<T>>>  

Метод и описание:

groupingBy(Function<? super T,? extends K> classifier)
Returns a Collector implementing a "group by" operation on input elements of type T, grouping elements according to a classification function, and returning the results in a Map.

Может кто-нибудь объяснить дженерики здесь?T, K и R. Я действительно запутался, как этот метод может соответствовать сигнатурам выше:

    List<Student> studentList = ....
    Map<String, List<Student>> groupByTeachersMap = studentList.stream()
     .collect(Collectors.groupingBy(Student::getTeachersName));

Я не могу понять, как метод collect может вернуть Map<String, List<Student>>, учитывая сигнатуру выше.Может кто-нибудь объяснить, как читать эту подпись?

1 Ответ

3 голосов
/ 11 мая 2019

Предполагая следующий минимальный класс:

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>>
...