Объединение нескольких списков в Java

если я хочу сделать два списка в один на Java, я могу использовать ListUtils.union(List list1,List list2). Но что, если я хочу объединить несколько списков?

это работает:

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)));

но это действительно не похоже на лучшее решение, и это не особенно здорово читать. К сожалению,ListUtils.union(list1,list2,list3,list4) не работает. Используя addAll несколько раз и создание собственного списка только для этого с дубликатами всех записей также не кажется мне идеальным. Так что я могу сделать вместо этого?

4 ответов


Java 8 имеет простой способ сделать это с помощью API потока показано в коде ниже. Мы в основном создали поток со всеми списками, а затем, поскольку нам нужно индивидуальное содержимое списков, необходимо сгладить его с помощью flatMap и, наконец, собрать элементы в 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]

добавление других альтернатив:

Вариант 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()); 
}

вариант 2:

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

используйте ArrayList для перечисления всех ваших списков....

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);

вот он ваш список будет сделан


вы можете написать свои собственные методы для объединения двух или более списков. Пример:

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;
    }
}