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 laListinterfaz? 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()RArrayList<Integer><R, A>
Collectors.toList()en este caso devuelve un ArrayList<Integer>" Es posible que no devuelva un ArrayList. La Listimplementació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 ArrayListo 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) .... "
Res el tipo genérico del tipo resultante.AEl 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.