簡単な答え
では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
すでに十分に短く、よく読みます。
Stream
sの使用
なぜそれがでなければならないのList
ですか?
Java 8以降Stream
では、より柔軟なを使用できます。
Stream<String> strings = Stream.of("foo", "bar", "baz");
あなたはStream
s を連結することができます:
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"]