Tengo la siguiente situación
Map<Key, ListContainer> map;
public class ListContainer{
List<AClass> lst;
}
Tengo que fusionar todas las listas lst
de los ListContainer
objetos de un Map
mapa.
public static void main(String args[]){
List<AClass> alltheObjectsAClass = map.values().stream(). // continue....
}
¿Alguna idea de cómo usar la API de flujo de Java 8?
java
list
java-8
java-stream
mat_boy
fuente
fuente
{a: [1,2], b[3,4]}
, ¿desea encadenarlos, hacer me gusta[1,2,3,4]
, hacer una lista de listas[[1,2],[3,4]]
o comprimirlos[[1,3],[2,4]]
? Además, eres consciente de que un mapa no tiene orden, ¿verdad?[1,2,3,4]
sin clasificar!ListContainer
solo envuelve aList<T>
, puede reemplazarloMap<Key, ListContainer>
conMap<Key, List<T>>
Respuestas:
Creo que
flatMap()
es lo que estás buscando.Por ejemplo:
fuente
.flatMap(Collection::stream)
no es posible aquí?ListContainer
está encapsulado (es decir, tiene un captador paralst
), puede descomponerse.flatMap(->)
en.map(ListContainer::getLst)
.flatMap(Collection::stream)
.flatMap(Collection::stream)
no es posible sería mejor, creo. Debería ser más permanente..map(listContainer -> listContainer.lst).filter(Objects::nonNull).flatMap(Collection::stream)
Alternativa: Stream.concat ()
fuente
En Java 8 podemos usar la secuencia List1.stream (). Collect (Collectors.toList ()). AddAll (List2); Otra opción List1.addAll (List2)
fuente
Ya respondí anteriormente, pero aquí hay otro enfoque que podría tomar. No puedo encontrar la publicación original de la que adapté esto, pero aquí está el código por el bien de su pregunta. Como se señaló anteriormente, la función flatMap () es lo que buscaría utilizar con Java 8. Puede lanzarla en una clase de utilidad y simplemente llamar a "RandomUtils.combine (list1, list2, ...);" y obtendría una única lista con todos los valores. Solo tenga cuidado con el comodín; puede cambiarlo si desea un método menos genérico. También puede modificarlo para conjuntos; solo debe tener cuidado al usar flatMap () en conjuntos para evitar la pérdida de datos de los métodos equals / hashCode debido a la naturaleza de la interfaz de conjunto.
/** * Combines multiple lists into a single list containing all elements of * every list. * * @param <T> - The type of the lists. * @param lists - The group of List implementations to combine * @return a single List<?> containing all elements of the passed in lists. */ public static <T> List<?> combine(final List<?>... lists) { return Stream.of(lists).flatMap(List::stream).collect(Collectors.toList()); }
fuente