Die einfache Antwort
In Java 9 oder höher wurde danach List.of()
hinzugefügt:
List<String> strings = List.of("foo", "bar", "baz");
Mit Java 10 oder höher kann dies mit dem var
Schlüsselwort gekürzt werden .
var strings = List.of("foo", "bar", "baz");
Dies gibt Ihnen eine unveränderliche List
, so dass es nicht geändert werden kann.
Welches ist, was Sie in den meisten Fällen wollen, in denen Sie es vorab ausfüllen.
Java 8 oder früher:
List<String> strings = Arrays.asList("foo", "bar", "baz");
Dadurch erhalten Sie eine List
Unterstützung durch ein Array, sodass die Länge nicht geändert werden kann.
Aber du kannst anrufen List.set
, also ist es immer noch veränderlich .
Arrays.asList
Mit einem statischen Import können Sie noch kürzer machen :
List<String> strings = asList("foo", "bar", "baz");
Der statische Import:
import static java.util.Arrays.asList;
Was jede moderne IDE vorschlägt und automatisch für Sie erledigt.
Zum Beispiel drücken Sie in IntelliJ IDEA Alt+Enter
und wählen Static import method...
.
Ich empfehle jedoch nicht, die List.of
Methode auf zu verkürzen of
, da dies verwirrend wird.
List.of
ist schon kurz genug und liest sich gut.
Mit Stream
s
Warum muss es ein sein List
?
Mit Java 8 oder höher können Sie ein Stream
flexibleres verwenden:
Stream<String> strings = Stream.of("foo", "bar", "baz");
Sie können Stream
s verketten :
Stream<String> strings = Stream.concat(Stream.of("foo", "bar"),
Stream.of("baz", "qux"));
Oder Sie können von a Stream
nach a gehen List
:
import static java.util.stream.Collectors.toList;
List<String> strings = Stream.of("foo", "bar", "baz").collect(toList());
Verwenden Sie das Gerät jedoch vorzugsweise, Stream
ohne es zu sammeln List
.
Wenn Sie wirklich speziell eine brauchenjava.util.ArrayList
(Wahrscheinlich nicht.)
Um JEP 269 zu zitieren (Hervorhebung von mir):
Es gibt eine kleine Reihe von Anwendungsfällen zum Initialisieren einer veränderlichen Auflistungsinstanz mit einer vordefinierten Reihe von Werten. Normalerweise ist es vorzuziehen, diese vordefinierten Werte in einer unveränderlichen Sammlung zu haben und dann die veränderbare Sammlung über einen Kopierkonstruktor zu initialisieren.
Wenn Sie möchten sowohl vorab ausgefüllt ein ArrayList
und fügen Sie danach (warum?), Nutzung
ArrayList<String> strings = new ArrayList<>(List.of("foo", "bar"));
strings.add("baz");
oder in Java 8 oder früher:
ArrayList<String> strings = new ArrayList<>(asList("foo", "bar"));
strings.add("baz");
oder mit Stream
:
import static java.util.stream.Collectors.toCollection;
ArrayList<String> strings = Stream.of("foo", "bar")
.collect(toCollection(ArrayList::new));
strings.add("baz");
Aber auch hier ist es besser, das Stream
direkt zu verwenden, als es zu einem zu sammeln List
.
Programmieren Sie auf Schnittstellen, nicht auf Implementierungen
Sie sagten, Sie hätten die Liste als ArrayList
in Ihrem Code deklariert , aber Sie sollten dies nur tun, wenn Sie ein Mitglied verwenden ArrayList
, das nicht in enthalten ist List
.
Was Sie höchstwahrscheinlich nicht tun.
Normalerweise sollten Sie nur Variablen deklarieren durch die allgemeinste Schnittstelle , die Sie verwenden möchten (zB Iterable
, Collection
oder List
) und initialisieren sie mit der konkreten Umsetzung (zB ArrayList
, LinkedList
oder Arrays.asList()
).
Andernfalls beschränken Sie Ihren Code auf diesen bestimmten Typ, und es ist schwieriger, ihn zu ändern, wenn Sie möchten.
Wenn Sie beispielsweise ein ArrayList
an ein übergeben 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
}
Ein anderes Beispiel wäre, immer eine Variable zu deklarieren, InputStream
obwohl es normalerweise eine FileInputStream
oder eine ist BufferedInputStream
, weil Sie oder jemand anderes eines Tages bald eine andere Art von verwenden möchten InputStream
.
ArrasyList<String> places = ["Buenos Aires", "Córdoba", "La Plata"]