คำตอบง่ายๆ
ใน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+EnterStatic import method...
อย่างไรก็ตามฉันไม่แนะนำให้ย่อList.ofวิธีการให้สั้นลงofเพราะจะทำให้เกิดความสับสน
List.ofสั้นพอแล้วและอ่านได้ดี
ใช้Streamของ
ทำไมต้องเป็น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 Streamเป็นList:
import static java.util.stream.Collectors.toList;
List<String> strings = Stream.of("foo", "bar", "baz").collect(toList());
แต่ควรเพียงแค่ใช้โดยไม่เก็บไปStreamList
หากคุณต้องการจริงๆโดยเฉพาะjava.util.ArrayList
(คุณอาจไม่ทำเช่นนั้น)
ในการพูดJEP 269 (เน้นที่เหมือง):
มีกรณีการใช้งานขนาดเล็กสำหรับการเริ่มต้นอินสแตนซ์การรวบรวมที่ไม่แน่นอนด้วยชุดของค่าที่กำหนดไว้ล่วงหน้า โดยปกติแล้วจะดีกว่าถ้าให้ค่าที่กำหนดไว้ล่วงหน้านั้นอยู่ในคอลเล็กชันที่ไม่เปลี่ยนรูปแล้วจึงเริ่มต้นการรวบรวมที่ไม่แน่นอนผ่านตัวสร้างการคัดลอก
หากคุณต้องการทั้ง prepopulate 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");
แต่อีกครั้งมันจะดีกว่าที่จะเพียงแค่ใช้โดยตรงแทนการจัดเก็บภาษีไปยังStreamList
โปรแกรมไปยังส่วนต่อประสานไม่ใช่เพื่อการนำไปใช้งาน
คุณบอกว่าคุณได้ประกาศรายชื่อไว้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แม้ว่ามันมักจะเป็นFileInputStreamหรือBufferedInputStreamเพราะวันหนึ่งเร็ว ๆ นี้คุณหรือคนอื่นจะต้องการที่จะใช้บางชนิดอื่น ๆ InputStreamของ
ArrasyList<String> places = ["Buenos Aires", "Córdoba", "La Plata"]