Inisialisasi Daftar Java dalam Satu Baris

1. Perkenalan

Dalam tutorial singkat ini, kita akan menyelidiki bagaimana kita dapat menginisialisasi Daftar menggunakan satu baris.

2. Buat Dari Array

Kita bisa membuat List dari array dan berkat literal array kita bisa menginisialisasinya dalam satu baris:

List list = Arrays.asList(new String[]{"foo", "bar"});

Kita dapat mempercayai mekanisme varargs untuk menangani pembuatan array. Dengan begitu, kita bisa menulis kode yang lebih ringkas dan mudah dibaca:

@Test public void givenArraysAsList_thenInitialiseList() { List list = Arrays.asList("foo", "bar"); assertTrue(list.contains("foo")); }

Contoh hasil dari kode ini mengimplementasikan antarmuka List tetapi itu bukan java.util.ArrayList atau LinkedList . Sebaliknya, itu adalah Daftar yang didukung oleh larik asli yang memiliki dua implikasi.

Meskipun, nama kelasnya adalah ArrayList tetapi dalam paket java.util.Arrays .

2.1. Ukuran tetap

Instance hasil dari Arrays.asList akan memiliki ukuran tetap:

@Test(expected = UnsupportedOperationException.class) public void givenArraysAsList_whenAdd_thenUnsupportedException() { List list = Arrays.asList("foo", "bar"); list.add("baz"); }

2.2. Referensi Bersama

Array asli dan daftar berbagi referensi yang sama ke objek:

@Test public void givenArraysAsList_whenCreated_thenShareReference(){ String[] array = {"foo", "bar"}; List list = Arrays.asList(array); array[0] = "baz"; assertEquals("baz", list.get(0)); }

3. Membuat Dari Stream (Java 8)

Kami dapat dengan mudah mengubah Aliran menjadi Koleksi apa pun .

Oleh karena itu, dengan metode pabrik untuk Streams , kita dapat membuat dan menginisialisasi daftar dalam satu baris:

@Test public void givenStream_thenInitializeList(){ List list = Stream.of("foo", "bar") .collect(Collectors.toList()); assertTrue(list.contains("foo")); }

Kita harus menandai di sini bahwa Collectors.toList () tidak menjamin implementasi yang tepat dari List yang dikembalikan .

Tidak ada kontrak umum tentang mutabilitas, kemampuan bersambung, atau keamanan thread dari instans yang dikembalikan. Oleh karena itu, kode kami tidak boleh bergantung pada salah satu properti ini.

Beberapa sumber menyoroti bahwa Stream.of (…) .collect (…) mungkin memiliki memori dan performa yang lebih besar daripada Arrays.asList () tetapi dalam hampir semua kasus, ini adalah pengoptimalan mikro sehingga hanya ada sedikit perbedaan.

4. Metode Pabrik (Java 9)

Di JDK 9, beberapa metode pabrik yang nyaman telah diperkenalkan untuk koleksi:

List list = List.of("foo", "bar", "baz"); Set set = Set.of("foo", "bar", "baz");

Satu detail penting adalah instance yang dikembalikan tidak dapat diubah . Di luar itu, metode pabrik memiliki beberapa keunggulan dalam efisiensi ruang dan keamanan benang.

Topik ini dibahas lebih lanjut di artikel ini.

5. Inisialisasi Penjepit Ganda

Di beberapa tempat, kita dapat menemukan metode yang disebut 'inisialisasi penjepit ganda' yang terlihat seperti:

@Test public void givenAnonymousInnerClass_thenInitialiseList() { List cities = new ArrayList() {{ add("New York"); add("Rio"); add("Tokyo"); }}; assertTrue(cities.contains("New York")); }

Nama 'inisialisasi kurung kurawal' cukup menyesatkan. Sintaksnya mungkin terlihat kompak dan elegan tetapi menyembunyikan apa yang terjadi di balik terpal.

Sebenarnya tidak ada elemen sintaks 'kurung kurawal' di Java, itu adalah dua blok yang diformat dengan cara ini.

Dengan kurung kurawal, kami mendeklarasikan kelas dalam anonim yang akan menjadi subkelas dari ArrayList . Di dalam tanda kurung ini, kami dapat mendeklarasikan detail subclass kami.

Seperti biasa, kita dapat menggunakan blok penginisialisasi instance dan dari sanalah sepasang kawat gigi berasal.

Singkatnya sintaks ini menggoda namun dianggap sebagai anti-pola.

Untuk membaca lebih lanjut tentang inisialisasi kurung ganda, lihat artikel kami di sini.

6. Kesimpulan

Java Modern menawarkan beberapa opsi untuk membuat Koleksi dalam satu baris. Metode yang kami pilih hampir seluruhnya tergantung pada preferensi pribadi, daripada alasan teknis.

Hal yang penting adalah bahwa, meskipun terlihat anggun, anti-pola inisialisasi kelas dalam anonim (alias 'penjepit ganda') memiliki banyak efek samping negatif .

Seperti biasa, kode tersedia di GitHub.