Question Comment joindre deux listes en Java?


Conditions: ne modifiez pas les listes originales; JDK uniquement, pas de bibliothèques externes. Points bonus pour un one-liner ou une version JDK 1.3.

Y a-t-il un moyen plus simple que:

List<String> newList = new ArrayList<String>();
newList.addAll(listOne);
newList.addAll(listTwo);

544
2017-10-09 23:17


origine


Réponses:


Au sommet de ma tête, je peux le raccourcir d'une ligne:

List<String> newList = new ArrayList<String>(listOne);
newList.addAll(listTwo);

436
2017-10-09 23:21



En Java 8:

List<String> newList = Stream.concat(listOne.stream(), listTwo.stream())
                             .collect(Collectors.toList());

369
2017-09-08 19:31



Vous pouvez utiliser le Apache commons-collections bibliothèque:

List<String> newList = ListUtils.union(list1, list2);

220
2017-08-27 03:28



Probablement pas plus simple, mais intrigant et moche:

List<String> newList = new ArrayList<String>() { { addAll(listOne); addAll(listTwo); } };

Ne l'utilisez pas dans le code de production ...;)


74
2017-10-10 00:30



Une de vos exigences est de préserver les listes originales. Si vous créez une nouvelle liste et utilisez addAll(), vous doublez effectivement le nombre de références aux objets dans vos listes. Cela peut entraîner des problèmes de mémoire si vos listes sont très volumineuses.

Si vous n'avez pas besoin de modifier le résultat concaténé, vous pouvez éviter cela en utilisant une implémentation de liste personnalisée. La classe d'implémentation personnalisée est plus d'une ligne, évidemment ... mais l'utiliser est court et doux.

CompositeUnmodifiableList.java:

public class CompositeUnmodifiableList<E> extends AbstractList<E> {

    private final List<E> list1;
    private final List<E> list2;

    public CompositeUnmodifiableList(List<E> list1, List<E> list2) {
        this.list1 = list1;
        this.list2 = list2;
    }

    @Override
    public E get(int index) {
        if (index < list1.size()) {
            return list1.get(index);
        }
        return list2.get(index-list1.size());
    }

    @Override
    public int size() {
        return list1.size() + list2.size();
    }
}

Usage:

List<String> newList = new CompositeUnmodifiableList<String>(listOne,listTwo);

73
2017-12-13 20:54



Pas plus simple, mais sans redimensionnement:

List<String> newList = new ArrayList<>(listOne.size() + listTwo.size());
newList.addAll(listOne);
newList.addAll(listTwo);

56
2017-12-13 20:35



Trouvé cette question cherchant à concaténer le nombre arbitraire de listes, ne faisant pas attention aux bibliothèques externes. Alors, peut-être que cela aidera quelqu'un d'autre:

com.google.common.collect.Iterables#concat()

Utile si vous voulez appliquer la même logique à un certain nombre de collections différentes dans un pour ().


46
2017-07-29 13:46



Un autre Java 8 one-liner:

List<String> newList = Stream.of(listOne, listTwo)
                             .flatMap(x -> x.stream())
                             .collect(Collectors.toList());

En prime, depuis Stream.of() est variadique, vous pouvez concaténer autant de listes que vous le souhaitez.

List<String> newList = Stream.of(listOne, listTwo, listThree)
                             .flatMap(x -> x.stream())
                             .collect(Collectors.toList());

37
2018-04-03 22:51



Voici une solution java 8 utilisant deux lignes:

List<Object> newList = new ArrayList<>();
Stream.of(list1, list2).forEach(newList::addAll);

Sachez que cette méthode ne doit pas être utilisée si

  • L'origine de newList n'est pas connu et il peut déjà être partagé avec d'autres threads
  • le flux qui modifie newList est un flux parallèle et l'accès à newList n'est pas synchronisé ou threadsafe

en raison de considérations d'effets secondaires.

Les deux conditions ci-dessus ne s'appliquent pas pour le cas ci-dessus de joindre deux listes, donc c'est sûr.

Basé sur cette réponse à une autre question.


28
2017-12-04 14:27



C'est simple et juste une ligne, mais ajoutera le contenu de listTwo à listOne. Avez-vous vraiment besoin de mettre le contenu dans une troisième liste?

Collections.addAll(listOne, listTwo.toArray());

26
2017-09-08 22:50



Un peu plus court serait:

List<String> newList = new ArrayList<String>(listOne);
newList.addAll(listTwo);

18
2017-10-09 23:22