it-swarm.com.de

Was ist der kürzeste Weg, um die Liste der Strings in Java zu initialisieren?

Ich suche nach dem kürzesten Weg (im Code), um eine Liste von Strings und ein Array von Strings zu initialisieren, d. H. Eine Liste/ein Array mit den String-Elementen "S1", "s2", "s3".

49
Vladimir

Es gibt verschiedene Möglichkeiten. Persönlich verwende ich gerne Guave :

List<String> strings = Lists.newArrayList("s1", "s2", "s3");

(Guava ist auf jeden Fall eine Bibliothek wert :)

Wenn Sie nur das JDK verwenden, können Sie Folgendes verwenden:

List<String> strings = Arrays.asList("s1", "s2", "s3");

Beachten Sie, dass dies ein ArrayList zurückgibt, aber das ist nicht der normale Java.util.ArrayList - es ist ein interner, der veränderlich, aber fest ist -Größe.

Persönlich bevorzuge ich die Guava-Version, da sie klar macht, was los ist (die Listenimplementierung, die zurückgegeben wird). Es ist auch noch klar, was los ist, wenn Sie die Methode statisch importieren:

// import static com.google.common.collect.Lists.newArrayList;
List<String> strings = newArrayList("s1", "s2", "s3");

... während, wenn Sie statisch asList importieren, es ein wenig seltsamer aussieht.

Eine weitere Guava-Option, wenn Sie keine modifizierbare Liste möchten:

ImmutableList<String> strings = ImmutableList.of("s1", "s2", "s3");

Normalerweise möchte ich entweder eine vollständig veränderbare Liste haben (in diesem Fall ist Lists.newArrayList am besten) oder eine vollständig unveränderliche Liste (in diesem Fall ist ImmutableList.of am besten). Es ist selten, dass ich wirklich eine Liste mit veränderlicher, aber fester Größe möchte .

94
Jon Skeet

Java 9+

Java 9 führt eine Komfortmethode List.of ein, die wie folgt verwendet wird:

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

Java 8 und älter

Hier sind einige Alternativen:

// 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");
}};


Wenn es sich um Arrays handelt, können Sie sie am Deklarationspunkt wie folgt initialisieren:

String[] arr = { "s1", "s2", "s3" };

Wenn Sie es erneut initialisieren oder erstellen müssen, ohne es in einer Variablen zu speichern, müssen Sie dies tun

new String[] { "s1", "s2", "s3" }

Wenn die String-Konstanten jedoch may sind, würde es so aussehen

String[] arr = { "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10",
                 "s11", "s12", "s13" };

In diesen schreibe ich meistens lieber

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

Alle diese Objekte sind im JDK vorhanden.

PS: Wie aioobe angegeben, macht dies die Liste von fester Größe.

14
Buhake Sindi

Sie können die Klasse Arrays in der Standard-Java-API verwenden: http://download.Oracle.com/javase/6/docs/api/Java/util/Arrays.html#asList(T ...)

List<String> strings = Arrays.asList("s1", "s2", "s3");

Beachten Sie, dass die Ergebnisliste eine feste Größe hat (Sie können sie nicht hinzufügen).

3
Mathias Schwarz

Mit Eclipse Collections können Sie Folgendes schreiben:

List<String> list = Lists.mutable.with("s1", "s2", "s3");

Sie können sich auch genauer auf die Typen beziehen und ob sie veränderlich oder unveränderlich sind.

MutableList<String> mList = Lists.mutable.with("s1", "s2", "s3");
ImmutableList<String> iList = Lists.immutable.with("s1", "s2", "s3");

Sie können dasselbe auch mit Sets, Taschen und Karten machen:

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

Es gibt auch Fabriken für SortedSets, SortedBags und 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");

Hinweis: Ich bin ein Committer für Eclipse Collections.

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

Außerdem gibt es viele andere Möglichkeiten, die von anderen Bibliotheken wie Guava bereitgestellt werden.

1
LazerBanana

Ich bin nicht mit Guava vertraut, aber fast alle Lösungen, die in anderen Antworten erwähnt werden und die Verwendung des JDK erleiden, weisen einige Mängel auf:

  1. Die Arrays.asList-Methode gibt eine Liste mit fester Größe zurück.

  2. {{Double-Brace-Initialisierung}} ist dafür bekannt, Klassenpfadstörungen und langsame Ausführung zu erzeugen. Es erfordert auch eine Codezeile pro Element.

  3. Java 9: Die statische Factory-Methode List.of gibt eine strukturell unveränderliche Liste zurück. Darüber hinaus ist List.ofwertbasiert , und daher garantiert der Vertrag nicht, dass jedes Mal ein neues Objekt zurückgegeben wird.


Hier ist ein Java 8-Einzeiler zum Zusammenfassen mehrerer einzelner Objekte in einer ArrayList oder einer beliebigen Sammlung für diese Angelegenheit.

List<String> list = Stream.of("s1", "s2", "s3").collect(Collectors.toCollection(ArrayList::new));

Note: Die Lösung von aioobe, eine vorübergehende Sammlung (new ArrayList<>(Arrays.asList("s1", "s2", "s3"))) zu kopieren, ist ebenfalls hervorragend.

0
MikaelF