คำตอบง่ายๆ
ใน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
ของ
ทำไมต้องเป็น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 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 (เน้นที่เหมือง):
มีกรณีการใช้งานขนาดเล็กสำหรับการเริ่มต้นอินสแตนซ์การรวบรวมที่ไม่แน่นอนด้วยชุดของค่าที่กำหนดไว้ล่วงหน้า โดยปกติแล้วจะดีกว่าถ้าให้ค่าที่กำหนดไว้ล่วงหน้านั้นอยู่ในคอลเล็กชันที่ไม่เปลี่ยนรูปแล้วจึงเริ่มต้นการรวบรวมที่ไม่แน่นอนผ่านตัวสร้างการคัดลอก
หากคุณต้องการทั้ง 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");
แต่อีกครั้งมันจะดีกว่าที่จะเพียงแค่ใช้โดยตรงแทนการจัดเก็บภาษีไปยัง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
แม้ว่ามันมักจะเป็นFileInputStream
หรือBufferedInputStream
เพราะวันหนึ่งเร็ว ๆ นี้คุณหรือคนอื่นจะต้องการที่จะใช้บางชนิดอื่น ๆ InputStream
ของ
ArrasyList<String> places = ["Buenos Aires", "Córdoba", "La Plata"]