Pregunta ¿Cómo unir dos listas en Java?


Condiciones: no modifique las listas originales; Solo JDK, sin bibliotecas externas. Puntos de bonificación para una versión de un trazador de líneas o JDK 1.3.

¿Hay una manera más simple que:

List<String> newList = new ArrayList<String>();
newList.addAll(listOne);
newList.addAll(listTwo);

544
2017-10-09 23:17


origen


Respuestas:


Fuera de mi cabeza, puedo acortarlo por una línea:

List<String> newList = new ArrayList<String>(listOne);
newList.addAll(listTwo);

436
2017-10-09 23:21



En Java 8:

List<String> newList = Stream.concat(listOne.stream(), listTwo.stream())
                             .collect(Collectors.toList());

369
2017-09-08 19:31



Podrías usar el Colecciones comunes de Apache biblioteca:

List<String> newList = ListUtils.union(list1, list2);

220
2017-08-27 03:28



Probablemente no sea más simple, pero intrigante y feo:

List<String> newList = new ArrayList<String>() { { addAll(listOne); addAll(listTwo); } };

No lo use en el código de producción ...;)


74
2017-10-10 00:30



Uno de sus requisitos es preservar las listas originales. Si creas una lista nueva y usas addAll(), en realidad estás doblando el número de referencias a los objetos en tus listas. Esto podría ocasionar problemas de memoria si sus listas son muy grandes.

Si no necesita modificar el resultado concatenado, puede evitarlo con una implementación de lista personalizada. La clase de implementación personalizada es más de una línea, obviamente ... pero su uso es breve y dulce.

CompositeUnmodifiableList.java:

public class CompositeUnmodifiableList<E> extends AbstractList<E> {

    private final List<E> list1;
    private final List<E> list2;

    public CompositeUnmodifiableList(List<E> list1, List<E> list2) {
        this.list1 = list1;
        this.list2 = list2;
    }

    @Override
    public E get(int index) {
        if (index < list1.size()) {
            return list1.get(index);
        }
        return list2.get(index-list1.size());
    }

    @Override
    public int size() {
        return list1.size() + list2.size();
    }
}

Uso:

List<String> newList = new CompositeUnmodifiableList<String>(listOne,listTwo);

73
2017-12-13 20:54



No es más simple, pero sin cambiar el tamaño de la tara:

List<String> newList = new ArrayList<>(listOne.size() + listTwo.size());
newList.addAll(listOne);
newList.addAll(listTwo);

56
2017-12-13 20:35



Encontré esta pregunta buscando concatenar una cantidad arbitraria de listas, sin importar las bibliotecas externas. Entonces, quizás ayude a alguien más:

com.google.common.collect.Iterables#concat()

Útil si desea aplicar la misma lógica a varias colecciones diferentes en una para ().


46
2017-07-29 13:46



Otro Java 8 one-liner:

List<String> newList = Stream.of(listOne, listTwo)
                             .flatMap(x -> x.stream())
                             .collect(Collectors.toList());

Como extra, ya que Stream.of() es variadic, puede concatenar tantas listas como desee.

List<String> newList = Stream.of(listOne, listTwo, listThree)
                             .flatMap(x -> x.stream())
                             .collect(Collectors.toList());

37
2018-04-03 22:51



Aquí hay una solución java 8 que usa dos líneas:

List<Object> newList = new ArrayList<>();
Stream.of(list1, list2).forEach(newList::addAll);

Tenga en cuenta que este método no debe usarse si

  • el origen de newList no se conoce y puede que ya se comparta con otros hilos
  • la corriente que modifica newList es un flujo paralelo y acceso a newList no está sincronizado o es seguro

debido a consideraciones de efectos secundarios.

Ambas condiciones anteriores no se aplican para el caso anterior de unir dos listas, por lo que es seguro.

Residencia en esta respuesta a otra pregunta.


28
2017-12-04 14:27



Esto es simple y solo una línea, pero agregará el contenido de listTwo a listOne. ¿De verdad necesitas poner los contenidos en una tercera lista?

Collections.addAll(listOne, listTwo.toArray());

26
2017-09-08 22:50



Un poco más corto sería:

List<String> newList = new ArrayList<String>(listOne);
newList.addAll(listTwo);

18
2017-10-09 23:22