Estaba tratando de convertir una matriz int a List y tomé la ruta desconocida de usar Java 8 Stream y se me ocurrió esto
Arrays.stream(arr).boxed().collect(Collectors.toList());
Todavía tengo dificultades para entender completamente esta línea, principalmente,
¿Por qué
Collectors.toList()
en este caso se devuelve una interfaz deArrayList<Integer>
implementaciónList
? ¿Por qué noLinkedList<Integer>
o cualquier otra clase genérica conforme a laList
interfaz? No puedo encontrar nada sobre esto, excepto una breve mención de ArrayList aquí , en la sección de Notas de la API.¿Qué significa el panel izquierdo de ? Obviamente es el tipo de retorno genérico ( en mi código aquí). Y creo que es el argumento de tipo genérico del método, pero ¿cómo se especifican? Miré en el documento de interfaz de Collector y no pude absorberlo.
Stream.collect()
R
ArrayList<Integer>
<R, A>
Collectors.toList()
en este caso devuelve un ArrayList<Integer>
" Es posible que no devuelva un ArrayList
. La List
implementación no está definida , por lo que no puede confiar en la implementación que devuelve. Como dice el javadoc : "No hay garantías sobre el tipo , mutabilidad, serialización o seguridad de subprocesos de la Lista devuelta".
toList()
no está devolviendo una ArrayList
o List
, está devolviendo una Collector
, que eventualmente creará y devolverá una List
, también la documentación dice: "... No hay garantías sobre el tipo , mutabilidad, serialización o seguridad de subprocesos de la Lista devuelta; si se requiere más control sobre la Lista devuelta, use toCollection (Supplier) .... "
R
es el tipo genérico del tipo resultante.A
El tipo genérico del tipo de acumulación intermedia del recopilador. Ese es el detalle de implementación de cómo funciona un colector. Divide y conquista, también para el procesamiento paralelo, recoge primero en tipos intermedios.