23
List<List<String>> superlist = new ArrayList<List<String>>();

List<String> list1 = new ArrayList<String>();
list1.add("a1");
list1.add("a2");

List<String> list2 = new ArrayList<String>();
list2.add("b1");
list2.add("b2");

List<String> list3= new ArrayList<String>();
list3.add("c1");
list3.add("c2");

superlist.add(list1);
superlist.add(list2);
superlist.add(list3);

List<String> result= new ArrayList<>();

Now I want to create a new list which contains all the values in superList. Here result should contain a1,a2,b1,b2,c1,c2

Michael
  • 41,989
  • 11
  • 82
  • 128
Manu Joy
  • 1,739
  • 6
  • 18
  • 30

5 Answers5

58

Try like this using flatMap:

List<List<Object>> list = 
List<Object> lst = list.stream()
        .flatMap(Collection::stream)
        .collect(Collectors.toList());
Gautham
  • 766
  • 7
  • 15
Rahul Tripathi
  • 168,305
  • 31
  • 280
  • 331
7

If you're on Java < 8 (and cannot use Streams), you can do this in a one-liner with Guava's Iterables.concat:

List<String> merged = Lists.newArrayList(Iterables.concat(superList));
Mick Mnemonic
  • 7,808
  • 2
  • 26
  • 30
3
superlist.forEach(e -> result.addAll(e));

Now after some reasarch, I found this way.

Manu Joy
  • 1,739
  • 6
  • 18
  • 30
  • Which is the best method for the question in terms of performance – Manu Joy Apr 14 '15 at 19:24
  • Actually, a plain for-loop would be even faster since iterators tend to consume quite a bit of memory if you use them all over the place. But most of the time performance is not even an issue, especially nowadays. I just noticed that this answer was posted almost 6 years ago. – F. Müller Jan 24 '21 at 05:46
2

You would have to loop through every List in your superlist object in order to get all of the contents. You can use the addAll() method to copy each list's contents to your new List:

List<String> result = new ArrayList<String>();
for (List<String> list : superlist) {
    result.addAll(list);
}
camelsaucerer
  • 301
  • 3
  • 12
0

This works for me!

List<String> result= new ArrayList<>();
    
    superlist.stream().forEach(
            
            n->result.addAll(n)
            );
    
    System.out.println(result);