Si je veux faire deux listes en une seule en Java, je peux utiliser ListUtils.union(List list1,List list2)
. Mais que faire si je veux combiner plusieurs listes?
Cela marche:
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)));
Mais cela ne ressemble pas vraiment à la meilleure solution, ni particulièrement agréable à lire. Malheureusement, ListUtils.union(list1,list2,list3,list4)
ne fonctionne pas. Utiliser addAll
plusieurs fois et créer sa propre liste rien que pour cela avec des doublons de toutes les entrées ne me semble pas idéal non plus. Alors, que puis-je faire à la place?
Java 8 permet de le faire facilement à l'aide de Stream API indiqué dans le code ci-dessous. Nous avons essentiellement créé un flux avec toutes les listes, et comme nous avons besoin du contenu individuel des listes, il est nécessaire de l'aplatir avec flatMap
et finalement de collecter les éléments dans un fichier 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]
Ajout d'autres 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);
Utilisez une liste de tableaux pour lister toutes vos listes ....
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 votre liste sera faite
Vous pouvez écrire vos propres méthodes pour fusionner deux listes ou plus. Exemple:
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;
}
}