Combinar múltiples listas en Java

5 minutos de lectura

Avatar de usuario de Fabian Röling
Fabián Röling

Si quiero hacer dos listas en una en Java, puedo usar ListUtils.union(List list1,List list2). Pero, ¿y si quiero combinar varias listas?

Esto funciona:

import org.apache.commons.collections.ListUtils;
List<Integer>list1=Arrays.asList(1,2,3);
List<Integer>list2=Arrays.asList(4,5,6);
List<Integer>list3=Arrays.asList(7,8,9);
List<Integer>list4=Arrays.asList(10,0,-1);
System.out.println(ListUtils.union(ListUtils.union(list1, list2),ListUtils.union(list3, list4)));

Pero en realidad no parece la mejor solución, ni es particularmente bueno para leer. Desafortunadamente ListUtils.union(list1,list2,list3,list4) no funciona Usando addAll varias veces y crear su propia lista solo para eso con duplicados de todas las entradas tampoco me parece ideal. Entonces, ¿qué puedo hacer en su lugar?

  • ListUtils no es una clase API de Java estándar. ¿Se refiere a la clase ListUtils de apache-commons? Si es así, edite su pregunta para que quede claro.

    – Erwin Bolwidt

    24 de julio de 2017 a las 13:10


  • @MickMnemonic ¿Un animal también es un gato?

    – Erwin Bolwidt

    24 de julio de 2017 a las 13:17


  • @MickMnemonic No, no lo es. No lo volví a abrir, creo que Ghostcat lo hizo él mismo después de darse cuenta de que este no es un duplicado correcto. Si alguien pregunta cómo combinar Listas sin mencionar una biblioteca en particular, entonces una pregunta que pregunta y se responde cómo combinar Iterables usando Guayaba es no un duplicado correcto.

    – Erwin Bolwidt

    24 de julio de 2017 a las 13:22

  • Dado que la gente parece haber llegado a la conclusión ahora de que esta no es una pregunta duplicada, ¿alguien puede decirme por qué todavía se considera una mala pregunta? Tiene dos votos negativos.

    – Fabián Röling

    25 de julio de 2017 a las 9:53

  • Y un año después está en +11. Hay algunos comportamientos de votación muy extraños en este sitio…

    – Fabián Röling

    6 de diciembre de 2018 a las 9:06

Java 8 tiene una manera fácil de hacerlo con la ayuda de API de transmisión se muestra en el siguiente código. Básicamente, hemos creado una secuencia con todas las listas, y luego, como necesitamos los contenidos individuales de las listas, es necesario aplanarlo con flatMap y finalmente recoger los elementos en un List.

List<Integer>list1=Arrays.asList(1,2,3);
List<Integer>list2=Arrays.asList(4,5,6);
List<Integer>list3=Arrays.asList(7,8,9);
List<Integer>list4=Arrays.asList(10,0,-1);
List<Integer> newList = Stream.of(list1, list2, list3,list4)
                                      .flatMap(Collection::stream)
                                      .collect(Collectors.toList());       
 System.out.println(newList); // prints [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 0, -1]

  • Alguien parece haber eliminado los comentarios aquí por alguna razón. Aquí hay un archivo: web.archive.org/web/20170725052617/https://stackoverflow.com/… Además, recuerdo que alguien dijo “esto es una gran cantidad de gastos generales”, lo que probablemente pretendía señalar que las conversiones a un flujo y la espalda son operaciones costosas. Para el rendimiento es mucho mejor usar addAll, especialmente porque agregar muchos elementos a una lista no puede ser multiproceso de manera efectiva. Wow, he aprendido mucho desde que hice esta pregunta!

    – Fabián Röling

    29 mayo 2019 a las 18:10

  • Para eliminar elementos duplicados, use Collectors.toSet() en lugar de list..

    – Ismail Yavuz

    17 de diciembre de 2019 a las 8:29

Agregando otras alternativas:

OPCIÓN 1:

List<Integer> joinedList = joinLists(list1, list2, list3, list4);

public static <T> List<T> joinLists(List<T>... lists) {
        return Arrays.stream(lists).flatMap(Collection::stream).collect(Collectors.toList()); 
}

OPCION 2:

List<Integer> joinedList = new ArrayList<>();
Stream.of(list1, list2, list3, list4).forEach(joinedList::addAll);

  • Me gusta más esta respuesta que la sugerida, aunque es muy similar, porque es más limpia. Usando la API de transmisión y una función de reducción, esto podría incluso simplificarse, por lo que ya no es necesario el “nuevo ArrayList” por separado.

    – Cheppsn

    17 de mayo de 2019 a las 9:09

  • Tenga en cuenta que si tiene una gran cantidad de elementos en las listas, sus referencias se guardan en la memoria varias veces. Eche un vistazo al uso de listas originales para recuperar datos aquí stackoverflow.com/a/13868352/11152683

    – Lubo

    7 de abril de 2020 a las 5:20

Use un ArrayList para listar todas sus listas….

ArrayList<String> arrl = new ArrayList<String>();
List<String> list1 = new ArrayList<String>();
    list.add("one");
    list.add("two");
List<String> list2 = new ArrayList<String>();
    list.add("one1");
    list.add("two2");
    arrl.addAll(list1);
arrl.addAll(list2);
    System.out.println("After Copy: "+arrl);

Eso es todo su lista se hará

Puede escribir sus propios métodos para fusionar dos o más listas. Ejemplo:

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class Test{ 
    public static void main(String[] args) {
        List<Integer>list1 = Arrays.asList(1,2,3);
        List<Integer>list2 = Arrays.asList(4,5,6);
        List<Integer>list3 = Arrays.asList(7,8,9);
        List<Integer>list4 = Arrays.asList(10,0,-1);

        System.out.println(combineMyLists(list1,list2,list3,list4));
        System.out.println("----------------------");
        System.out.println(combineMyLists2(list1,list2,list3,list4));
    } 
    private static List<Integer> combineMyLists(List<Integer>... args) {
        List<Integer> combinedList = new ArrayList<>();
        for(List<Integer> list : args){
            for(Integer i: list){
               combinedList.add(i);
            }
        }
        return combinedList;
    }
    private static List<Integer> combineMyLists2(List<Integer>... args) {
        List<Integer> combinedList = Stream.of(args).flatMap(i -> i.stream()).collect(Collectors.toList());   ;
        return combinedList;
    }
}

¿Ha sido útil esta solución?