解释Java 8 Collector接口/方法签名

use*_*934 5 java java-8 java-stream collectors

根据Java 8 Docs

修饰符和类型:

<R,A> R 
Run Code Online (Sandbox Code Playgroud)

方法和说明:

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

修饰符和类型:

static <T,K> Collector<T,?,Map<K,List<T>>>  
Run Code Online (Sandbox Code Playgroud)

方法和说明:

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.
Run Code Online (Sandbox Code Playgroud)

有人可以在这里解释泛型吗?T,K和R。我真的很困惑这种方法如何符合上面的签名:

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

Map<String, List<Student>>给定以上签名,我看不到collect如何返回。有人可以解释如何阅读此签名吗?

Nam*_*man 6

假设以下最小类:

class Student {
    String teachersName;

    public String getTeachersName() {
        return teachersName;
    }
}
Run Code Online (Sandbox Code Playgroud)

您可以通过在每个步骤中匹配输入和输出返回类型来关联您的代码。例如,签名为groupingBy

// <T, K> Collector<T, ?, Map<K, List<T>>> groupingBy(Function<? super T, ? extends K> classifier)       
Run Code Online (Sandbox Code Playgroud)

并且您的具体实现详述为:

Collectors.groupingBy(new Function<Student, String>() {
    @Override
    public String apply(Student student) {
        return student.getTeachersName();
    }
})
Run Code Online (Sandbox Code Playgroud)

在你的情况下返回

Collector<Student, ?, Map<String, List<Student>>>
Run Code Online (Sandbox Code Playgroud)

此外,如果您查看collect操作的签名,即

// <R, A> R collect(Collector<? super T, A, R> collector)
Run Code Online (Sandbox Code Playgroud)

因此,在您的情况下,返回R如下:

Map<String, List<Student>>
Run Code Online (Sandbox Code Playgroud)