Stream.collect(Collector<? super T, A, R> collector)
<R,A> R collect(Collector<? super T,A,R> collector)
Performs a mutable reduction operation on the elements of this stream using a Collector.
Collectors.groupingBy(Function<? super T,? extends K> classifier)
public 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.
Por favor alguien puede explicar los genéricos T
, K
y R
? Estoy muy confundido cómo este tipo de método puede ajustarse a las firmas anteriores:
List<Student> studentList = ....
Map<String, List<Student>> groupByTeachersMap = studentList.stream()
.collect(Collectors.groupingBy(Student::getTeachersName));
No puedo ver cómo collect
puede vuelta Map<String, List<Student>>
dada la firma anterior. ¿Puede alguien explicar cómo leer esta firma?
Suponiendo que la siguiente clase de mínimos:
class Student {
String teachersName;
public String getTeachersName() {
return teachersName;
}
}
Se puede relacionar con su código, haciendo coincidir los tipos de retorno de entrada y salida en cada paso. Ejemplo, la firma para groupingBy
gradas como:
// <T, K> Collector<T, ?, Map<K, List<T>>> groupingBy(Function<? super T, ? extends K> classifier)
y su aplicación específica como se detalla:
Collectors.groupingBy(new Function<Student, String>() {
@Override
public String apply(Student student) {
return student.getTeachersName();
}
})
lo que a su declaración de caso
Collector<Student, ?, Map<String, List<Student>>>
y además, si nos fijamos en la firma del collect
decir, la operación
// <R, A> R collect(Collector<? super T, A, R> collector)
por lo tanto, en su caso volviendo R
como en:
Map<String, List<Student>>