web-dev-qa-db-fra.com

Le moyen le plus concis de convertir un ensemble <String> en une liste <String>

Je suis en train de faire ceci:

Set<String> setOfTopicAuthors = ....

List<String> list = Arrays.asList( 
    setOfTopicAuthors.toArray( new String[0] ) );

Pouvez-vous battre ça?

197
Jacques René Mesrine
List<String> list = new ArrayList<String>(listOfTopicAuthors);
423
Schildmeijer
List<String> l = new ArrayList<String>(listOfTopicAuthors);
88
Adamski

Considérant que nous avons Set<String> stringSet, nous pouvons utiliser les éléments suivants:

Java 10 (liste non modifiable)

List<String> strList = stringSet.stream().collect(Collectors.toUnmodifiableList());

Java 8 (Listes modifiables)

import static Java.util.stream.Collectors.*;
List<String> stringList1 = stringSet.stream().collect(toList());

Selon le doc pour la méthode toList()

Il n'y a aucune garantie sur le type, la mutabilité, la sérialisabilité ou la sécurité des threads de la liste renvoyée. si vous avez besoin de plus de contrôle sur la liste renvoyée, utilisez toCollection (Supplier).

Donc, si nous avons besoin d’une implémentation spécifique, par ex. ArrayList on peut l'obtenir de cette façon:

List<String> stringList2 = stringSet.stream().
                              collect(toCollection(ArrayList::new));

Java 8 (Listes non modifiables)

Nous pouvons utiliser la méthode Collections::unmodifiableList et enrouler la liste renvoyée dans les exemples précédents. Nous pouvons également écrire notre propre méthode personnalisée en tant que:

class ImmutableCollector {
    public static <T> Collector<T, List<T>, List<T>> toImmutableList(Supplier<List<T>> supplier) {
            return Collector.of( supplier, List::add, (left, right) -> {
                        left.addAll(right);
                        return left;
                    }, Collections::unmodifiableList);
        }
}

Et puis utilisez-le comme:

List<String> stringList3 = stringSet.stream()
             .collect(ImmutableCollector.toImmutableList(ArrayList::new)); 

Une autre possibilité consiste à utiliser la méthode collectingAndThen qui permet d'effectuer une transformation finale avant de renvoyer le résultat:

    List<String> stringList4 = stringSet.stream().collect(collectingAndThen(
      toCollection(ArrayList::new),Collections::unmodifiableList));

Un point à noter est que la méthode Collections::unmodifiableList renvoie une vue non modifiable de la liste spécifiée, conformément à doc . Une collection de vues non modifiable est une collection qui est non modifiable et constitue également une vue sur une collection de supports. Notez que les modifications apportées à la collection de sauvegarde peuvent encore être possibles et, si elles se produisent, elles sont visibles via la vue non modifiable. Mais la méthode du collecteur Collectors.unmodifiableList renvoie une liste vraiment immuable en Java 10 .

22
i_am_zero

Essayez ceci pour Set :

Set<String> listOfTopicAuthors = .....
List<String> setList = new ArrayList<String>(listOfTopicAuthors); 

Essayez ceci pour Map :

Map<String, String> listOfTopicAuthors = .....
// List of values:
List<String> mapValueList = new ArrayList<String>(listOfTopicAuthors.values());
// List of keys:
List<String> mapKeyList = new ArrayList<String>(listOfTopicAuthors.KeySet());
13

Si vous utilisez Guava, vous importez de manière statique la méthode newArrayList de Listes classe:

List<String> l = newArrayList(setOfAuthors);
2
Andrejs

je ne sais pas vraiment ce que vous faites exactement via le contexte de votre code mais ...

pourquoi faire la variable listOfTopicAuthors?

List<String> list = Arrays.asList((....).toArray( new String[0] ) );

le "...." représente cependant votre jeu est entré en jeu, qu'il soit neuf ou venu d'un autre endroit.

0
jp093121