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 ?
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 ?
... et ainsi défier radicalement les conventions du code Java : oracle.com/technetwork/java/javase/documentation/ ! :) :)
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 ?
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 ?
Pour avoir répondu dans la même minute que la réponse acceptée et ne pas avoir obtenu le crédit. +1
@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."
Considérant que nous avons Set<String> stringSet
nous pouvons utiliser ce qui suit :
List<String> strList = new ArrayList<>(stringSet);
List<String> strList = Lists.newArrayList(stringSet);
List<String> strList = new ArrayList<>();
CollectionUtils.addAll(strList, stringSet);
List<String> strList = List.copyOf(stringSet);
List<String> strList = stringSet.stream().collect(Collectors.toUnmodifiableList());
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));
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 .
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());
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.
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)).
2 votes
@JacquesRenéMesrine : La première ligne du code en question est trompeuse : Attendu :
Set<String> setOfTopicAuthors = ....
Réel :Set<String> listOfTopicAuthors = ....
0 votes
Ou une autre façon de faire la même chose pourrait être
List<String> list = Arrays.asList(setOfTopicAuthors.toArray(String[]::new))
détaillée dans la réponse en lien.0 votes
Solution pour Java 8 et Java 10 : stackoverflow.com/a/32179585/1216775