Je cherche le moyen le plus court (en code) d’initialiser une liste de chaînes et un tableau de chaînes, c’est-à-dire une liste/un tableau contenant "S1", "s2", "s3".
Il y a différentes options. Personnellement, j'aime bien utiliser Goyave :
List<String> strings = Lists.newArrayList("s1", "s2", "s3");
(Guava est une bibliothèque qui vaut le coup d’être, bien sûr :)
En utilisant uniquement le JDK, vous pouvez utiliser:
List<String> strings = Arrays.asList("s1", "s2", "s3");
Notez que ceci retournera une ArrayList
, mais c'est pas le Java.util.ArrayList
normal - c'est un interne qui est modifiable mais de taille fixe.
Personnellement, je préfère la version de goyave, car elle explique clairement ce qui se passe (la mise en oeuvre de la liste qui sera retournée). C'est aussi encore effacer ce qui se passe si vous importez la méthode de manière statique:
// import static com.google.common.collect.Lists.newArrayList;
List<String> strings = newArrayList("s1", "s2", "s3");
... alors que si vous importez asList
de manière statique, cela semble un peu plus étrange.
Une autre option de goyave, si vous ne voulez pas de liste modifiable de quelque manière que ce soit:
ImmutableList<String> strings = ImmutableList.of("s1", "s2", "s3");
En règle générale, je veux soit avoir une liste complètement mutable (auquel cas Lists.newArrayList
est préférable) ou une liste complètement immuable (auquel cas ImmutableList.of
est préférable). Il est rare que je veux une liste de taille variable mais modifiable.
Java 9 introduit une méthode pratique List.of
utilisé comme suit:
List<String> l = List.of("s1", "s2", "s3");
Voici quelques alternatives:
// Short, but the resulting list is fixed size.
List<String> list1 = Arrays.asList("s1", "s2", "s3");
// Similar to above, but the resulting list can grow.
List<String> list2 = new ArrayList<>(Arrays.asList("s1", "s2", "s3"));
// Using initialization block. Useful if you need to "compute" the strings.
List<String> list3 = new ArrayList<String>() {{
add("s1");
add("s2");
add("s3");
}};
En ce qui concerne les tableaux, vous pouvez l'initialiser au moment de la déclaration, comme ceci:
String[] arr = { "s1", "s2", "s3" };
Si vous devez le réinitialiser ou le créer sans le stocker dans une variable, vous devez
new String[] { "s1", "s2", "s3" }
Si les constantes de chaîne sont peut cependant, cela ressemblerait à
String[] arr = { "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10",
"s11", "s12", "s13" };
Dans ceux-ci, je préfère généralement écrire
String[] arr = "s1,s2,s3,s4,s5,s6,s7,s8,s9,s10,s11,s12,s13".split(",");
List<String> stringList = Arrays.asList("s1", "s2", "s3");
Tous ces objets existent dans le JDK.
PS: Comme aioobe déclaré, la liste est de taille fixe.
Vous pouvez utiliser la classe Arrays
dans l'API Java standard: http://download.Oracle.com/javase/6/docs/api/Java/util/Arrays.html#asList(T ...)
List<String> strings = Arrays.asList("s1", "s2", "s3");
Sachez que la liste résultante est de taille fixe (vous ne pouvez pas y ajouter).
Avec Collections Eclipse , vous pouvez écrire ce qui suit:
List<String> list = Lists.mutable.with("s1", "s2", "s3");
Vous pouvez également être plus précis sur les types et s'ils sont mutables ou immuables.
MutableList<String> mList = Lists.mutable.with("s1", "s2", "s3");
ImmutableList<String> iList = Lists.immutable.with("s1", "s2", "s3");
Vous pouvez également faire la même chose avec des ensembles, des sacs et des cartes:
Set<String> set = Sets.mutable.with("s1", "s2", "s3");
MutableSet<String> mSet = Sets.mutable.with("s1", "s2", "s3");
ImmutableSet<String> iSet = Sets.immutable.with("s1", "s2", "s3");
Bag<String> bag = Bags.mutable.with("s1", "s2", "s3");
MutableBag<String> mBag = Bags.mutable.with("s1", "s2", "s3");
ImmutableBag<String> iBag = Bags.immutable.with("s1", "s2", "s3");
Map<String, String> map =
Maps.mutable.with("s1", "s1", "s2", "s2", "s3", "s3");
MutableMap<String, String> mMap =
Maps.mutable.with("s1", "s1", "s2", "s2", "s3", "s3");
ImmutableMap<String, String> iMap =
Maps.immutable.with("s1", "s1", "s2", "s2", "s3", "s3");
Il existe également des usines pour SortedSets, SortedBags et SortedMaps.
SortedSet<String> sortedSet = SortedSets.mutable.with("s1", "s2", "s3");
MutableSortedSet<String> mSortedSet = SortedSets.mutable.with("s1", "s2", "s3");
ImmutableSortedSet<String> iSortedSet = SortedSets.immutable.with("s1", "s2", "s3");
SortedBag<String> sortedBag = SortedBags.mutable.with("s1", "s2", "s3");
MutableSortedBag<String> mSortedBag = SortedBags.mutable.with("s1", "s2", "s3");
ImmutableSortedBag<String> iSortedBag = SortedBags.immutable.with("s1", "s2", "s3");
SortedMap<String, String> sortedMap =
SortedMaps.mutable.with("s1", "s1", "s2", "s2", "s3","s3");
MutableSortedMap<String, String> mSortedMap =
SortedMaps.mutable.with("s1", "s1", "s2", "s2", "s3","s3");
ImmutableSortedMap<String, String> iSortedMap =
SortedMaps.immutable.with("s1", "s1", "s2", "s2", "s3","s3");
Note: Je suis un partisan des collections Eclipse.
JDK2
List<String> list = Arrays.asList("one", "two", "three");
JDK7
//diamond operator
List<String> list = new ArrayList<>();
list.add("one");
list.add("two");
list.add("three");
JDK8
List<String> list = Stream.of("one", "two", "three").collect(Collectors.toList());
JDK9
List<String> list = List.of("one", "two", "three");
De plus, il y a beaucoup d'autres moyens fournis par d'autres bibliothèques comme Guava.
Je ne suis pas familier avec Goyave, mais presque toutes les solutions mentionnées dans d'autres réponses et l'utilisation du JDK souffrent de certains défauts:
La méthode Arrays.asList
renvoie une liste de taille fixe.
{{Initialisation double accolade}} est connu pour créer un encombrement de chemin de classe et ralentir l'exécution . Il nécessite également une ligne de code par élément.
Java 9: la méthode de fabrique statique List.of
renvoie une liste structurellement immuable. De plus, List.of
est value-based , et son contrat ne garantit donc pas qu’il retournera un nouvel objet à chaque fois.
Voici une ligne unique Java 8 permettant de regrouper plusieurs objets individuels dans une ArrayList
, ou n'importe quelle collection.
List<String> list = Stream.of("s1", "s2", "s3").collect(Collectors.toCollection(ArrayList::new));
Note: la solution de aioobe consistant à copier une collection transitoire (new ArrayList<>(Arrays.asList("s1", "s2", "s3"))
) est également excellente.