41

If I want to make two lists into one in Java, I can use ListUtils.union(List list1,List list2). But what if I want to combine multiple lists?

This works:

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

But it doesn't really look like the best solution, neither is it particularly great to read. Sadly ListUtils.union(list1,list2,list3,list4) doesn't work. Using addAll multiple times and creating its own list just for that with duplicates of all the entries also doesn't seem ideal to me. So what can I do instead?

Fabian Röling
  • 871
  • 1
  • 9
  • 26
  • 3
    `ListUtils` is not a standard Java API class. Are you referring to the apache-commons ListUtils class? If so, please edit your question to make that clear. – Erwin Bolwidt Jul 24 '17 at 13:10
  • @Bit Who says that this OP is using Guava? Your duplicate is a question that specifically asks about Guava and the answer is also using Guava – Erwin Bolwidt Jul 24 '17 at 13:11
  • @ErwinBolwidt, the dupe also has a native Java 8 solution. – Mick Mnemonic Jul 24 '17 at 13:11
  • @MickMnemonic The dupe is providing answers how to create Iterables, not Lists as this OP is asking. – Erwin Bolwidt Jul 24 '17 at 13:13
  • A `List` is an `Iterable`, right? There isn't really a difference in the context of this question. – Mick Mnemonic Jul 24 '17 at 13:16
  • 1
    @MickMnemonic An Animal is a Cat too? – Erwin Bolwidt Jul 24 '17 at 13:17
  • This is a duplicate of [Combine multiple Collections into a single logical Collection?](https://stackoverflow.com/questions/4896662/combine-multiple-collections-into-a-single-logical-collection). It was already closed as a dupe once, but for some reason reopened. – Mick Mnemonic Jul 24 '17 at 13:19
  • 1
    @MickMnemonic No it is not. I didn't reopen it - I think Ghostcat did himself after he realized this isn't a correct duplicate. If someone asks how to combine Lists without mentioning a particular library, then a question that asks and is answered how to combine Iterables using Guava is **not** a correct duplicate. – Erwin Bolwidt Jul 24 '17 at 13:22
  • @ErwinBolwidt, again, if you look at the answers in the linked question, only one of them uses Guava, and there are native Java 8/7 solutions as well. The question is also the first Google hit for "Combine multiple lists in Java". I don't see how this question is not a duplicate. Maybe you can write an answer to prove me wrong? – Mick Mnemonic Jul 24 '17 at 13:29
  • @ErwinBolwidt I didn't know that it's not standard Java. I use an Eclipse version from a company intranet page, adjusted to my needs. I don't know all details of it. Tomorrow I'll look at the import. – Fabian Röling Jul 24 '17 at 17:29
  • Yes, it is the import from Apache. – Fabian Röling Jul 25 '17 at 07:19
  • 1
    Since people seem to have come to the conclusion now that this is not a duplicate question, can someone please tell me why it's still considered a bad question? It has two downvotes. – Fabian Röling Jul 25 '17 at 09:53
  • My first "popular question" badge and the question in question has a negative score. Something is weird here... – Fabian Röling Nov 02 '17 at 12:22
  • And now it's a "notable question" with negative score. – Fabian Röling Dec 07 '17 at 06:51
  • And one year later it's at +11. There are some very weird voting behaviours on this site… – Fabian Röling Dec 06 '18 at 09:06

4 Answers4

80

Java 8 has an easy way of doing it with the help of Stream API shown in the code below. We have basically created a stream with all the lists , and then as we need the individual contents of the lists, there is a need to flatten it with flatMap and finally collect the elements in a 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]
Pallavi Sonal
  • 2,811
  • 13
  • 18
  • 3
    Someone seems to have purged the comments here for some reason. Here is an archive: https://web.archive.org/web/20170725052617/https://stackoverflow.com/questions/45281454/combine-multiple-lists-in-java Also, I remember someone saying "this is a lot of overhead", which was probably meant to point out that the conversions to a stream and back are expensive operations. For performance it's much better to use `addAll`, especially because adding many elements to one list can't be multithreaded effectively. Wow, I learned so much since I asked this question! – Fabian Röling May 29 '19 at 18:10
  • To remove duplicated items use Collectors.toSet() instead of list.. – Ismail Yavuz Dec 17 '19 at 08:29
12

Adding other alternatives:

OPTION 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()); 
}

OPTION 2:

List<Integer> joinedList = new ArrayList<>();
Stream.of(list1, list2, list3, list4).forEach(joinedList::addAll);
Sahil Chhabra
  • 7,481
  • 4
  • 53
  • 53
  • I like this better than the suggested answer, even though it is very similar, because it's cleaner. Using the stream api and a reduce function this could even be more streamlined, so the separate "new ArrayList" is not necessary anymore. – cheppsn May 17 '19 at 09:09
  • Note, that if you have huge number of elements in lists, your references are held in memory multiple times. Have a look at using original lists for retrieving data here https://stackoverflow.com/a/13868352/11152683 – Lubo Apr 07 '20 at 05:20
1

Use an ArrayList to list down all your Lists....

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

Thats it your list will be made

Khan.N
  • 29
  • 4
1

You can write your own methods to merge two or more lists. Example:

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;
    }
}
Eritrean
  • 9,903
  • 1
  • 15
  • 20