Condiciones: no modifique las listas originales; JDK solamente, no hay bibliotecas externas. Puntos de bonificación para una versión de una línea o JDK 1.3.
¿Hay una manera más simple que:
List<String> newList = new ArrayList<String>();
newList.addAll(listOne);
newList.addAll(listTwo);
Respuestas:
En Java 8:
fuente
List<String> newList = Stream.concat(listOne.stream(), listTwo.stream()).distinct().collect(Collectors.toList());
Stream.of(listOne, listTwo).flatMap(Collection::stream).collect(Collectors.toList())
Desde la parte superior de mi cabeza, puedo acortarlo en una línea:
fuente
addAll()
de ambas. Intenté todos los que sugieren no copiar las listas y resultan tener una sobrecarga que no necesitábamos esta vez.addAll(Collection)
devuelve aboolean
.Puede usar la biblioteca de colecciones comunes de Apache :
fuente
Uno de sus requisitos es preservar las listas originales. Si crea una nueva lista y la usa
addAll()
, efectivamente está duplicando el número de referencias a los objetos en sus listas. Esto podría provocar problemas de memoria si sus listas son muy grandes.Si no necesita modificar el resultado concatenado, puede evitarlo utilizando una implementación de lista personalizada. La clase de implementación personalizada es más de una línea, obviamente ... pero usarla es corta y agradable.
CompositeUnmodifiableList.java:
Uso:
fuente
Collections.unmodifiableList()
método, que envuelve una lista para que no se pueda modificar.CompositeUnmodifiableList
hace lo mismo, excepto que envuelve dos listas y proporciona una vista concatenada. Todos los puntos que hacesCompositeUnmodifiableList
también son ciertosCollections.unmodifiableList()
.List<? extends E>
Probablemente no más simple, pero intrigante y feo:
No lo use en el código de producción ...;)
fuente
Otro Java 8 one-liner:
Como
Stream.of()
beneficio adicional, dado que es variable, puede concatenar tantas listas como desee.fuente
x -> x.stream()
podría ser reemplazado porCollection::stream
.List::stream
.No es más simple, pero sin cambiar el tamaño de la sobrecarga:
fuente
Encontré esta pregunta buscando concatenar una cantidad arbitraria de listas, sin importar bibliotecas externas. Entonces, quizás ayude a alguien más:
Útil si desea aplicar la misma lógica a varias colecciones diferentes en una para ().
fuente
com.google.common.collect.Iterators#concat(java.util.Iterator<? extends java.util.Iterator<? extends T>>)
lugar deIterables#concat()
; ¡porque el posterior todavía copia elementos en el enlace temporal!La solución propuesta es para tres listas, aunque también se puede aplicar para dos listas. En Java 8 podemos hacer uso de Stream.of o Stream.concat como:
Stream.concat
toma dos secuencias como entrada y crea una secuencia concatenada perezosamente cuyos elementos son todos los elementos de la primera secuencia seguidos de todos los elementos de la segunda secuencia. Como tenemos tres listas, hemos usado este método (Stream.concat
) dos veces.También podemos escribir una clase de utilidad con un método que tome cualquier número de listas (usando varargs ) y devuelva una lista concatenada como:
Entonces podemos hacer uso de este método como:
fuente
Aquí hay una solución de Java 8 que usa dos líneas:
Tenga en cuenta que este método no debe usarse si
newList
se desconoce el origen de y ya se puede compartir con otros hilosnewList
es una secuencia paralela y el accesonewList
no está sincronizado o es segurodebido a consideraciones de efectos secundarios.
Las dos condiciones anteriores no se aplican al caso anterior de unir dos listas, por lo que esto es seguro.
Basado en esta respuesta a otra pregunta.
fuente
newList
no es observable por ningún otro hilo. Pero tiene razón en que esto probablemente no debería hacerse si se desconoce de dóndenewList
proviene el valor de (por ejemplo, sinewList
se pasó como parámetro..forEach(newList::addAll);
lugar de.collect(Collectors.toList());
?List<List<Object>>
. Lo que puede tener en mente es algo como esto: stackoverflow.com/questions/189559/…flatMap
.Esto es simple y solo una línea, pero agregará el contenido de listTwo to listOne. ¿Realmente necesitas poner el contenido en una tercera lista?
fuente
Ligeramente más simple:
fuente
List
estructura no impone restricciones de unicidad. Puede eliminar los engaños haciendo lo mismo con los conjuntos.Set<String> newSet = new HashSet<>(setOne); newSet.addAll(setTwo);
Un poco más corto sería:
fuente
Puede crear su método de utilidad genérico Java 8 para concatenar cualquier cantidad de listas .
fuente
Puede hacer un oneliner si la lista de objetivos está predeclarada.
fuente
En Java 8 (al revés):
fuente
otra solución de un revestimiento utilizando
Java8
flujo, ya que laflatMap
solución ya está publicada, aquí hay una solución sinflatMap
o
código
salida
fuente
flatMap
, porque las listas solo se repiten una vez cuando se recopilanEl más inteligente en mi opinión:
fuente
@SafeVarargs
!Podrías hacerlo con una importación estática y una clase auxiliar
nb el generification de esta clase probablemente podría mejorarse
Entonces puedes hacer cosas como
fuente
Versión de Java 8 con soporte para unirse por clave de objeto:
fuente
fuente
Usa una clase de ayuda.
Yo sugiero:
fuente
fuente
Podemos unir 2 listas usando java8 con 2 enfoques.
1) Usando concat:
2) Usando flatMap:
fuente
Casi todas las respuestas sugieren usar una ArrayList.
Prefiere usar un LinkedList para operaciones de adición eficientes.
ArrayList add es O (1) amortizado, pero O (n) en el peor de los casos ya que la matriz debe ser redimensionada y copiada. Mientras que LinkedList add siempre es constante O (1).
más información https://stackoverflow.com/a/322742/311420
fuente
No estoy afirmando que sea simple, pero mencionaste la bonificación por frases ingeniosas ;-)
fuente
De ninguna manera cerca de una línea, pero creo que este es el más simple:
fuente
Aquí hay un enfoque que usa streams y java 8 si sus listas tienen diferentes tipos y desea combinarlas en una lista de otro tipo.
fuente
Si desea hacer esto estáticamente, puede hacer lo siguiente.
Los ejemplos usan 2 EnumSets en orden natural (== Enum-order)
A, B
y luego se unen en unaALL
lista.fuente
fuente