web-dev-qa-db-fra.com

Quel est le moyen le plus court pour initialiser la liste des chaînes en java?

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".

49
Vladimir

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.

92
Jon Skeet

Java 9+

Java 9 introduit une méthode pratique List.of utilisé comme suit:

List<String> l = List.of("s1", "s2", "s3");

Java 8 et plus

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(",");
24
aioobe
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.

14
Buhake Sindi

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).

3
Mathias Schwarz

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.

2
Donald Raab

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.

1
LazerBanana

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:

  1. La méthode Arrays.asList renvoie une liste de taille fixe.

  2. {{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.

  3. 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.

0
MikaelF