¿Cómo puedo convertir una Lista de Listas en una Lista en Java 8?
Si tengo un List<List<Object>>
, ¿cómo puedo convertirlo en un List<Object>
que contenga todos los objetos en el mismo orden de iteración utilizando las funciones de Java 8?
Puede utilizar flatMap
para aplanar las listas internas (después de convertirlas en Streams) en una sola Stream y luego recopilar el resultado en una lista:
List<List<Object>> list = ...
List<Object> flat =
list.stream()
.flatMap(List::stream)
.collect(Collectors.toList());
El flatMap
método on Stream
ciertamente puede aplanar esas listas por usted, pero debe crear Stream
objetos para el elemento y luego a Stream
para el resultado.
No necesitas todos esos Stream
objetos. Aquí está el código simple y conciso para realizar la tarea.
// listOfLists is a List<List<Object>>.
List<Object> result = new ArrayList<>();
listOfLists.forEach(result::addAll);
Debido a que a List
es Iterable
, este código llama al forEach
método (función de Java 8), que se hereda de Iterable
.
Realiza la acción dada para cada elemento de
Iterable
hasta que todos los elementos hayan sido procesados o la acción genere una excepción. Las acciones se realizan en el orden de iteración, si ese orden se especifica.
Y a List
devuelve Iterator
los artículos en orden secuencial.
Para Consumer
, este código pasa una referencia de método (característica de Java 8) al método anterior a Java 8 List.addAll
para agregar los elementos de la lista interna de forma secuencial.
Agrega todos los elementos de la colección especificada al final de esta lista, en el orden en que los devuelve el iterador de la colección especificada (operación opcional).