Basit cevap
In Java 9 veya üstü, sonra List.of()
eklendi:
List<String> strings = List.of("foo", "bar", "baz");
İle Java 10 üstü veya bununla kısaltılabilir var
anahtar kelime.
var strings = List.of("foo", "bar", "baz");
Bu size değişmez bir şey verecektir List
, bu yüzden değiştirilemez.
Önceden doldurduğunuz çoğu durumda istediğiniz şey budur.
Java 8 veya öncesi:
List<String> strings = Arrays.asList("foo", "bar", "baz");
Bu size List
bir dizi tarafından desteklenir, böylece uzunluğu değiştiremez.
Ama arayabilirsiniz List.set
, bu yüzden hala değişebilir .
Sen yapabilir Arrays.asList
statik ithalat ile daha kısa:
List<String> strings = asList("foo", "bar", "baz");
Statik içe aktarma:
import static java.util.Arrays.asList;
Hangi herhangi bir modern IDE sizin için önerecek ve otomatik olarak yapacak.
Örneğin IntelliJ IDEA içinde tuşuna Alt+Enter
basıp seçin Static import method...
.
Ancak, List.of
yöntemin kısaltılmasını önermiyorum of
, çünkü bu kafa karıştırıcı hale geliyor.
List.of
zaten yeterince kısa ve iyi okuyor.
kullanılması Stream
s
Neden bir olmak zorunda List
?
Java 8 veya daha yenisi Stream
ile daha esnek olanı kullanabilirsiniz :
Stream<String> strings = Stream.of("foo", "bar", "baz");
Leri birleştirebilirsiniz Stream
:
Stream<String> strings = Stream.concat(Stream.of("foo", "bar"),
Stream.of("baz", "qux"));
Ya da bir den gidebilirsiniz Stream
a List
:
import static java.util.stream.Collectors.toList;
List<String> strings = Stream.of("foo", "bar", "baz").collect(toList());
Ama tercihen, Stream
a'yı toplamadan kullanın List
.
Eğer varsa gerçekten özellikle ihtiyaçjava.util.ArrayList
(Muhtemelen yapmıyorsunuz.) JEP 269'u
alıntılamak için (benimkini vurgulayın):
Önceden tanımlanmış bir değer kümesiyle değiştirilebilir bir toplama örneğini başlatmak için küçük bir kullanım durumu kümesi vardır. Bu önceden tanımlanmış değerlerin değişmez bir koleksiyonda olması ve daha sonra değiştirilebilir koleksiyonun bir kopya oluşturucu aracılığıyla başlatılması genellikle tercih edilir.
Eğer isterseniz hem önceden doldurmak An ArrayList
ve (neden?) Sonradan kendisine, kullanımını eklemek
ArrayList<String> strings = new ArrayList<>(List.of("foo", "bar"));
strings.add("baz");
veya Java 8 veya önceki sürümlerde:
ArrayList<String> strings = new ArrayList<>(asList("foo", "bar"));
strings.add("baz");
veya kullanarak Stream
:
import static java.util.stream.Collectors.toCollection;
ArrayList<String> strings = Stream.of("foo", "bar")
.collect(toCollection(ArrayList::new));
strings.add("baz");
Ama yine de, Stream
doğrudan bir yerine toplamak yerine doğrudan kullanmak daha iyidir List
.
Uygulamalara değil, arayüzlere program
Eğer bir listeyi ilan ettik söyledi ArrayList
Kodunuzdaki, ama eğer tek bir üyesini kullanıyorsanız arasan ArrayList
o burada değil List
.
Hangi muhtemelen yapmıyorsun.
Genellikle sadece (örneğin kullanım edeceklerini en genel arayüzü tarafından değişkenleri bildirmek gerekir Iterable
, Collection
ya da List
) ve spesifik uygulamaya onları başlatmaya (örneğin ArrayList
, LinkedList
ya da Arrays.asList()
).
Aksi takdirde kodunuzu belirli bir türle sınırlandırırsınız ve istediğiniz zaman değiştirmek daha zor olacaktır.
Örneğin, bir geçiriyorsanız eğer ArrayList
bir etmek 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
}
Başka bir örnek InputStream
, genellikle a FileInputStream
veya a olmasına rağmen her zaman değişken bildirmek olacaktır BufferedInputStream
, çünkü bir gün yakında siz veya başka biri başka bir tür kullanmak isteyecektir InputStream
.
ArrasyList<String> places = ["Buenos Aires", "Córdoba", "La Plata"]