web-dev-qa-db-ja.com

Javaで文字列のリストを初期化する最短の方法は何ですか?

文字列のリストと文字列の配列、つまり「s1」、「s2」、「s3」の文字列要素を含むリスト/配列を初期化する最短の方法(コード内)を探しています。

52
Vladimir

さまざまなオプションがあります。個人的には Guava を使用するのが好きです:

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

(グアバはとにかく持っておく価値のあるライブラリです:)

JDKのみを使用すると、次を使用できます。

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

これはArrayListを返しますが、それはnot通常のJava.util.ArrayList-可変ですが固定サイズの内部的なものです。

個人的には、何が起こっているか(返されるリスト実装)を明確にするため、Guavaバージョンを好みます。また、stillメソッドを静的にインポートした場合に何が起こっているかを明確にします。

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

...一方、asListを静的にインポートすると、少し奇妙に見えます。

変更可能な任意のリストが必要ない場合の別のグアバオプション:

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

私は通常、either完全に変更可能なリストを持っています(その場合はLists.newArrayListが最適)または完全に不変のリスト(この場合ImmutableList.of 最高です)。私が本当にwant可変だが固定サイズのリストを望むことはまれです。

95
Jon Skeet

Java 9+

Java 9では、便利なメソッド List.of 次のように使用します。

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

Java 8以前

いくつかの選択肢があります:

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


配列に関しては、宣言の時点で次のように初期化できます。

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

再初期化するか、変数に保存せずに作成する必要がある場合は、

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

ただし、文字列定数がそうであれば、次のようになります

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

これらの中で私は通常書くことを好みます

String[] arr = "s1,s2,s3,s4,s5,s6,s7,s8,s9,s10,s11,s12,s13".split(",");
27
aioobe
List<String> stringList = Arrays.asList("s1", "s2", "s3");

これらのオブジェクトはすべてJDKに存在します。

PS:aioobe のように、これによりリストのサイズが固定されます。

15
Buhake Sindi

標準のJava API: http://download.Oracle.com/javase/6/docs/api/Java/でArraysクラスを使用できます。 util/Arrays.html#asList(T ...)

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

結果のリストは固定サイズであることに注意してください(追加することはできません)。

3
Mathias Schwarz

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

さらに、Guavaのような他のライブラリによって提供される他の多くの方法があります。

2
LazerBanana

Eclipse Collections を使用すると、次のように記述できます。

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

また、タイプと、それらがミュータブルかイミュータブルかについて、より具体的にすることもできます。

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

セット、バッグ、マップでも同じことができます。

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

SortedSets、SortedBags、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");

注:私はEclipse Collectionsのコミッターです。

2
Donald Raab

私はグアバに精通していませんが、他の回答で言及されたほとんどすべてのソリューションとJDKの使用にはいくつかの欠陥があります:

  1. _Arrays.asList_メソッドは、固定サイズのリストを返します。

  2. {{Double-brace initialization}}は、クラスパスの乱雑さと 実行速度の低下 を作成することが知られています。また、要素ごとに1行のコードが必要です。

  3. Java 9:静的ファクトリメソッド _List.of_ 構造的に不変のリストを返します。さらに、_List.of_は 値ベース であるため、そのコントラクトは毎回新しいオブジェクトを返すことを保証しません。


以下は、複数の個々のオブジェクトをArrayListに収集するためのJava 8ワンライナー)、またはそのためのコレクションです。

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

:一時的なコレクション(new ArrayList<>(Arrays.asList("s1", "s2", "s3")))をコピーするaioobeのソリューションも優れています。

0
MikaelF