Copier une liste dans une autre liste en Java

Copier une liste dans une autre liste en Java

1. Vue d'ensemble

Dans ce rapide didacticiel, nous allons montrer différentes façons de copier unList vers un autreList et une erreur courante produite dans le processus.

Pour une introduction à l'utilisation deCollections, veuillez vous référer àto this article here.

2. Constructeur

Un moyen simple de copier unList est d'utiliser le constructeur qui prend une collection comme argument:

List copy = new ArrayList<>(list);

Étant donné que nous copions la référence ici et que nous ne clonons pas les objets, toutes les modifications apportées à un élément affecteront les deux listes.

Pour cette raison, utiliser le constructeur est utile pour copier des objets immuables:

List copy = new ArrayList<>(list);

Integer est une classe immuable, sa valeur est définie lors de la création de l'instance et ne peut jamais changer.

Une référenceInteger peut donc être partagée par plusieurs listes et threads et personne ne peut changer sa valeur.

3. ListConcurrentAccessException

A common problem working with lists is the ConcurrentAccessException. Cela pourrait signifier que nous modifions la liste pendant que nous essayons de la copier, probablement dans un autre fil de discussion.

Pour résoudre ce problème, nous devons soit:

  • Utilisez une collection conçue pour un accès simultané

  • Verrouillez la collection de manière appropriée pour la parcourir

  • Trouver un moyen d'éviter de devoir copier la collection d'origine

Compte tenu de notre dernière approche, ce n'est pas thread-safe. Donc, si nous voulons résoudre notre problème avec la première option, nous pouvons vouloir utiliserCopyOnWhiteArrayList, dans lequel toutes les opérations mutatives sont implémentées en faisant une nouvelle copie du tableau sous-jacent.

Pour plus d'informations, veuillez vous référer àto this article.

Si nous voulons verrouiller lesCollection, il est possible d’utiliser une primitive de verrouillage pour sérialiser l’accès en lecture / écriture, telle queReentrantReadWriteLock.

4. AddAll

Une autre approche pour copier des éléments consiste à utiliser la méthodeaddAll:

List copy = new ArrayList<>();
copy.addAll(list);

Il est important de garder à l’esprit lors de l’utilisation de cette méthode que, comme pour le constructeur, le contenu des deux listes fera référence aux mêmes objets.

5. Collections.copy

La classeCollections se compose exclusivement de méthodes statiques qui opèrent ou retournent des collections.

L'un d'eux estcopy, qui a besoin d'une liste de sources et d'une liste de destinations au moins aussi longues que la source.

Il maintiendra l'index de chaque élément copié dans la liste de destination, tel que l'original:

List source = Arrays.asList(1,2,3);
List dest = Arrays.asList(4,5,6);
Collections.copy(dest, source);

Dans l'exemple ci-dessus, tous les éléments précédents de la listedest ont été écrasés car les deux listes ont la même taille.

Si la taille de la liste de destination est plus grande que la source:

List source = Arrays.asList(1, 2, 3);
List dest = Arrays.asList(5, 6, 7, 8, 9, 10);
Collections.copy(dest, source);

Seuls les trois premiers éléments ont été remplacés, tandis que le reste des éléments de la liste est conservé.

6. Utiliser Java 8

Cette version de Java ouvre nos possibilités en ajoutant de nouveaux outils. Celui que nous allons explorer dans les exemples suivants estStream:

List copy = list.stream()
  .collect(Collectors.toList());

Les principaux avantages de cette méthode sont la possibilité d'utiliser des filtres et des sauts. Dans l'exemple suivant, nous allons ignorer le premier élément:

List copy = list.stream()
  .skip(1)
  .collect(Collectors.toList());

Il est également possible de filtrer par la longueur desString ou en comparant un attribut de nos objets:

List copy = list.stream()
  .filter(s -> s.length() > 10)
  .collect(Collectors.toList());
List flowers = list.stream()
  .filter(f -> f.getPetals() > 6)
  .collect(Collectors.toList());

Il est probable que nous souhaitons travailler de manière totalement sûre:

List flowers = Optional.ofNullable(list)
  .map(List::stream)
  .orElseGet(Stream::empty)
  .collect(Collectors.toList());

Et sautez un élément en utilisant aussi cette méthode:

List flowers = Optional.ofNullable(list)
  .map(List::stream).orElseGet(Stream::empty)
  .skip(1)
  .collect(Collectors.toList());

7. Utiliser Java 10

Enfin, l'une des dernières versions de Java nous permet de créer unList immuable contenant les éléments desCollection: donnés

List copy = List.copyOf(list);

Les seules conditions sont que la collection donnée ne doit pas être nulle et ne doit contenir aucun élément nul.

8. Conclusion

Dans cet article, nous avons exploré différentes façons de copier unList vers un autreList avec différentes versions deJava et une erreur courante générée dans le processus.

Comme toujours, des exemples de code peuvent être trouvés sur GitHubhere ethere.