簡単な答え
ではJavaの9以降、後にList.of()追加されました。
List<String> strings = List.of("foo", "bar", "baz");
Javaの10以降、これをして短縮することができますvarキーワード。
var strings = List.of("foo", "bar", "baz");
これは不変 を与えるListので、変更することはできません。
これは、事前に入力するほとんどの場合に必要です。
Java 8以前:
List<String> strings = Arrays.asList("foo", "bar", "baz");
これはList配列に裏打ちされているので、長さを変更することはできません。
ただし、を呼び出すことができるList.setので、変更は可能です。
Arrays.asList静的インポートでさらに短くすることができます:
List<String> strings = asList("foo", "bar", "baz");
静的インポート:
import static java.util.Arrays.asList;
最新のIDEが提案し、自動的に実行します。
たとえば、IntelliJ IDEAでは、を押しAlt+Enterて選択しますStatic import method...。
ただし、混乱するので、List.ofメソッドをofに短くすることはお勧めしません。
List.ofすでに十分に短く、よく読みます。
Streamsの使用
なぜそれがでなければならないのListですか?
Java 8以降Streamでは、より柔軟なを使用できます。
Stream<String> strings = Stream.of("foo", "bar", "baz");
あなたはStreams を連結することができます:
Stream<String> strings = Stream.concat(Stream.of("foo", "bar"),
Stream.of("baz", "qux"));
または、aからa Streamに移動できますList。
import static java.util.stream.Collectors.toList;
List<String> strings = Stream.of("foo", "bar", "baz").collect(toList());
ただし、Streamに収集せずにを使用することをお勧めしListます。
あなたが本当に具体的に必要な場合java.util.ArrayList
(おそらくそうではありません。)JEP 269(私の強調)
を引用するには:
ある小さなセット定義済みの値のセットで変更可能なコレクションのインスタンスを初期化するための使用例は。通常、これらの事前定義された値を不変のコレクションに入れ、コピーコンストラクターを介して可変のコレクションを初期化することをお勧めします。
事前入力と追加の両方を行う場合は(なぜですか?)、ArrayList
ArrayList<String> strings = new ArrayList<>(List.of("foo", "bar"));
strings.add("baz");
またはJava 8以前の場合:
ArrayList<String> strings = new ArrayList<>(asList("foo", "bar"));
strings.add("baz");
または使用Stream:
import static java.util.stream.Collectors.toCollection;
ArrayList<String> strings = Stream.of("foo", "bar")
.collect(toCollection(ArrayList::new));
strings.add("baz");
ただし、繰り返しますが、Streamに収集するのではなく、直接使用することをお勧めしListます。
実装ではなくインターフェイスへのプログラム
あなたは、あなたのようにリストを宣言したと述べたArrayListあなたのコードでは、しかし、あなたはあなたがいくつかのメンバー使用している場合があることを行う必要があるArrayListではありませんことをList。
あなたはおそらくそうしていないでしょう。
通常、あなただけの最も一般的なインターフェースで変数を宣言する必要があります(例えば、使用しようとしていることIterable、CollectionまたはList)、および特定の実装でそれらを初期化する(例えばArrayList、LinkedListまたはArrays.asList())。
それ以外の場合は、コードをその特定のタイプに制限しており、必要なときに変更するのが難しくなります。
たとえば、あなたが渡している場合ArrayListにはvoid method(...):
// Iterable if you just need iteration, for (String s : strings):
void method(Iterable<String> strings) {
for (String s : strings) { ... }
}
// Collection if you also need .size(), .isEmpty(), or .stream():
void method(Collection<String> strings) {
if (!strings.isEmpty()) { strings.stream()... }
}
// List if you also need .get(index):
void method(List<String> strings) {
strings.get(...)
}
// Don't declare a specific list implementation
// unless you're sure you need it:
void method(ArrayList<String> strings) {
??? // You don't want to limit yourself to just ArrayList
}
別の例としてInputStreamは、通常はa FileInputStreamまたはa BufferedInputStreamであっても、常に変数anを宣言します。ある日、あなたや他の誰かが他の種類のを使用するようになるからInputStreamです。
ArrasyList<String> places = ["Buenos Aires", "Córdoba", "La Plata"]