208 votes

La façon la plus concise de convertir un Set<T> en une List<T>.

Par exemple, je suis en train de faire ceci :

Set<String> setOfTopicAuthors = ....

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

Pouvez-vous le battre ?

2 votes

Utilice java.util.Collection : O(0)

0 votes

@Carl, je dois soumettre le Set à une interface tierce qui requiert une Liste. @Tim J'aimerais pouvoir changer l'interface de la tierce partie pour utiliser Collection.

1 votes

Je vois ; sauf contraintes étranges, je suivrais la réponse de Roger. Cependant, à moins que vous n'utilisiez à nouveau la liste, je ne l'assignerais à rien (par exemple, utilisez foo.api(new ArrayList<String>(listOfTopicAuthors)) au lieu de foo.api(list)).

446voto

Schildmeijer Points 10975
List<String> list = new ArrayList<String>(listOfTopicAuthors);

1 votes

... et ainsi défier radicalement les conventions du code Java : oracle.com/technetwork/java/javase/documentation/ ! :) :)

0 votes

Après cela, lorsque j'ai essayé d'accéder à l'élément de la liste, il m'a donné une erreur, " java.lang.ClassCastException : java.lang.Integer cannot be cast to java.lang.String" ..je ne sais pas pourquoi..c'est simple list.get(int) c'est tout ...une suggestion ?

2 votes

Je crois qu'à partir de Java 7, il est possible d'omettre le paramètre "type" dans la commande ArrayList cédant : List<String> l = new ArrayList<>(listOfTopicAuthors); Le plus concis sans utiliser une bibliothèque externe ?

93voto

Adamski Points 29884
List<String> l = new ArrayList<String>(listOfTopicAuthors);

6 votes

Pour avoir répondu dans la même minute que la réponse acceptée et ne pas avoir obtenu le crédit. +1

0 votes

@Adamski Je me retrouve avec une liste dont l'index commence à 1 au lieu de 0, un remède ?

1 votes

@Jack : Ce ne sera certainement pas le cas. Extrait de la Javadoc de java.util.List : "Les listes (comme les tableaux Java) sont basées sur zéro."

25voto

akhil_mittal Points 40

Considérant que nous avons Set<String> stringSet nous pouvons utiliser ce qui suit :

Plain Java

List<String> strList = new ArrayList<>(stringSet);

Goyave

List<String> strList = Lists.newArrayList(stringSet);

Apache Commons

List<String> strList = new ArrayList<>();
CollectionUtils.addAll(strList, stringSet);

Java 10 (liste non modifiable)

List<String> strList = List.copyOf(stringSet);
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());

Conformément à la doc pour la méthode toList()

Il n'y a pas de garantie sur le type, la mutabilité, la sérialisation, ou l'intégrité des données. sécurité thread de la liste retournée ; si un contrôle plus important sur la liste retournée retournée, utilisez toCollection(Supplier).

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

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

Java 8 (Listes non modifiables)

Nous pouvons utiliser Collections::unmodifiableList et envelopper la liste retournée dans les exemples précédents. Nous pouvons également écrire notre propre méthode personnalisée comme :

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 ensuite l'utiliser comme :

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

Une autre possibilité consiste à utiliser 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 à la règle suivante doc . Une collection de vues non modifiables est une collection qui n'est pas modifiable et qui est également une vue sur une collection de base. Notez que des modifications de la collection de base sont toujours possibles, et si elles se produisent, elles sont visibles à travers la vue non modifiable. Mais la méthode du collecteur Collectors.unmodifiableList retourne une liste vraiment immuable dans Java 10 .

14voto

Essayez ceci pour Définir :

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

Essayez ceci pour Carte :

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());

2voto

Andrejs Points 4235

Si vous utilisez Guava, vous importez statiquement newArrayList méthode de Listes classe :

List<String> l = newArrayList(setOfAuthors);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X