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.
Existe-t-il un moyen plus simple que:
List<String> newList = new ArrayList<String>();
newList.addAll(listOne);
newList.addAll(listTwo);
Réponses:
En Java 8:
la source
List<String> newList = Stream.concat(listOne.stream(), listTwo.stream()).distinct().collect(Collectors.toList());
Stream.of(listOne, listTwo).flatMap(Collection::stream).collect(Collectors.toList())
Du haut de ma tête, je peux le raccourcir d'une ligne:
la source
addAll()
des deux. J'ai essayé tous ceux qui suggèrent de ne pas copier les listes et ils entraînent beaucoup de frais généraux dont nous n'avions pas besoin cette fois.addAll(Collection)
renvoie aboolean
.Vous pouvez utiliser la bibliothèque Apache commons-collections :
la source
L'une de vos exigences est de conserver 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 pourrait 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 son utilisation est courte et douce.
CompositeUnmodifiableList.java:
Usage:
la source
Collections.unmodifiableList()
méthode, qui encapsule une liste pour la rendre non modifiable.CompositeUnmodifiableList
fait la même chose, sauf qu'il encapsule deux listes et fournit une vue concaténée. Tous les points que vous soulevezCompositeUnmodifiableList
sont également valablesCollections.unmodifiableList()
.List<? extends E>
Probablement pas plus simple, mais intrigant et laid:
Ne l'utilisez pas dans le code de production ...;)
la source
Une autre ligne unique Java 8:
En prime, comme
Stream.of()
c'est variadic, vous pouvez concaténer autant de listes que vous le souhaitez.la source
x -> x.stream()
pourrait être remplacé parCollection::stream
.List::stream
.Pas plus simple, mais sans redimensionner la surcharge:
la source
Trouvé cette question cherchant à concaténer une quantité arbitraire de listes, sans se soucier des bibliothèques externes. Donc, cela aidera peut-être quelqu'un d'autre:
Utile si vous souhaitez appliquer la même logique à plusieurs collections différentes en une pour ().
la source
com.google.common.collect.Iterators#concat(java.util.Iterator<? extends java.util.Iterator<? extends T>>)
au lieu deIterables#concat()
; car ces derniers copient toujours les éléments dans le lien temporaire!La solution proposée concerne trois listes, mais elle peut également s'appliquer à deux listes. Dans Java 8, nous pouvons utiliser Stream.of ou Stream.concat comme:
Stream.concat
prend deux flux en entrée et crée un flux paresseusement concaténé dont les éléments sont tous les éléments du premier flux suivis de tous les éléments du second flux. Comme nous avons trois listes, nous avons utilisé cette méthode (Stream.concat
) deux fois.Nous pouvons également écrire une classe utilitaire avec une méthode qui prend n'importe quel nombre de listes (en utilisant des varargs ) et retourne une liste concaténée comme:
Ensuite, nous pouvons utiliser cette méthode comme:
la source
Voici une solution java 8 utilisant deux lignes:
Sachez que cette méthode ne doit pas être utilisée si
newList
n'est pas connue et elle peut déjà être partagée avec d'autres threadsnewList
est un flux parallèle et l'accès ànewList
n'est pas synchronisé ou threadsafeen raison de considérations d'effets secondaires.
Les deux conditions ci-dessus ne s'appliquent pas au cas ci-dessus de rejoindre deux listes, c'est donc sans danger.
Basé sur cette réponse à une autre question.
la source
newList
n'est plus observable par aucun autre thread. Mais vous avez raison, cela ne devrait probablement pas être fait si on ne sait pas d'où vient la valeur denewList
(par exemple, si elle anewList
été passée en paramètre..forEach(newList::addAll);
au lieu de.collect(Collectors.toList());
?List<List<Object>>
. Ce que vous pourriez avoir à l'esprit est quelque chose comme ceci: stackoverflow.com/questions/189559/…flatMap
.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?
la source
Un peu plus simple:
la source
List
structure n'impose aucune contrainte d'unicité. Vous pouvez supprimer les dupes en faisant la même chose avec les ensembles.Set<String> newSet = new HashSet<>(setOne); newSet.addAll(setTwo);
Un peu plus court serait:
la source
Vous pouvez créer votre méthode utilitaire générique Java 8 pour concatrier n'importe quel nombre de listes .
la source
Vous pouvez faire un oneliner si la liste cible est pré-déclarée.
la source
En Java 8 (dans l'autre sens):
la source
une autre solution de liner en utilisant
Java8
stream, puisque laflatMap
solution est déjà publiée, voici une solution sansflatMap
ou
code
production
la source
flatMap
, car les listes ne sont itérées qu'une seule fois lors de leur collecteLe plus intelligent à mon avis:
la source
@SafeVarargs
!Vous pouvez le faire avec une importation statique et une classe d'assistance
nb la génération de cette classe pourrait probablement être améliorée
Ensuite, vous pouvez faire des choses comme
la source
Version Java 8 avec prise en charge de la jonction par clé d'objet:
la source
la source
Utilisez une classe d'assistance.
Je suggère:
la source
la source
Nous pouvons joindre 2 listes en utilisant java8 avec 2 approches.
1) Utilisation de concat:
2) Utilisation de flatMap:
la source
Presque des réponses suggèrent d'utiliser une ArrayList.
Préférez utiliser une LinkedList pour des opérations d'ajout efficaces.
ArrayList add est O (1) amorti, mais O (n) dans le pire des cas car le tableau doit être redimensionné et copié. Alors que LinkedList add est toujours constant O (1).
plus d'infos https://stackoverflow.com/a/322742/311420
la source
Je ne prétends pas que c'est simple, mais vous avez mentionné le bonus pour les one-liners ;-)
la source
Pas du tout près d'une ligne, mais je pense que c'est la plus simple:
la source
Voici une approche utilisant des flux et java 8 si vos listes ont différents types et que vous souhaitez les combiner à une liste d'un autre type.
la source
Si vous souhaitez le faire de manière statique, vous pouvez procéder comme suit.
Les exemples utilisent 2 EnumSets dans l'ordre naturel (== Enum-order)
A, B
et les rejoignent ensuite dans uneALL
liste.la source
la source