Permulaan Senarai Java dalam Satu Baris

1. Pengenalan

Dalam tutorial ringkas ini, kami akan menyiasat bagaimana kami dapat menginisialisasi Daftar dengan menggunakan satu pelapik.

2. Buat Dari Array

Kami dapat membuat Senarai dari array dan terima kasih kepada literal array kami dapat menginisialisasi dalam satu baris:

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

Kita boleh mempercayai mekanisme varargs untuk menangani pembuatan array. Dengan itu, kita dapat menulis kod yang lebih ringkas dan boleh dibaca:

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

Contoh hasil kod alat yang ini Senarai antara muka tetapi ia bukan satu java.util.ArrayList mahupun LinkedList . Sebaliknya, itu adalah Senarai yang disokong oleh susunan asal yang mempunyai dua implikasi.

Walaupun, nama kelas kebetulan adalah ArrayList tetapi dalam pakej java.util.Arrays .

2.1. Saiz Tetap

Contoh hasil dari Arrays.asList akan mempunyai ukuran tetap:

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

2.2. Rujukan Bersama

Susunan dan senarai asal berkongsi rujukan yang sama dengan 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. Buat Dari Aliran (Java 8)

Kita boleh menukar Aliran menjadi Koleksi apa pun dengan mudah .

Oleh itu dengan kaedah kilang untuk Aliran , kita dapat membuat dan memulakan senarai dalam satu baris:

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

Kita perlu menandakan di sini bahawa Collectors.toList () tidak menjamin pelaksanaan yang tepat daripada kembali Senarai .

Tidak ada kontrak umum mengenai kebolehubahan, kebolehpasaran atau keselamatan urutan dari contoh yang dikembalikan. Oleh itu kod kami tidak boleh bergantung pada sifat-sifat ini.

Beberapa sumber menyatakan bahawa Stream.of (…) .collect (…) mungkin mempunyai jejak memori dan prestasi yang lebih besar daripada Arrays.asList () tetapi dalam hampir semua kes, pengoptimuman mikro seperti itu terdapat sedikit perbezaan.

4. Kaedah Kilang (Java 9)

Di JDK 9, beberapa kaedah kilang yang mudah diperkenalkan untuk koleksi:

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

Satu perincian penting adalah contoh yang dikembalikan tidak berubah . Di luar itu, kaedah kilang mempunyai beberapa kelebihan dalam kecekapan ruang dan keselamatan benang.

Topik ini diterokai lebih banyak dalam artikel ini.

5. Permulaan Double-Brace

Di beberapa tempat, kita dapat menemui kaedah yang disebut 'inisial pendakap ganda' yang kelihatan seperti:

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

Nama 'inisial pendakap ganda' agak mengelirukan. Sintaksnya mungkin kelihatan padat dan elegan tetapi berbahaya menyembunyikan apa yang berlaku di bawah tudung.

Sebenarnya tidak ada unsur sintaks 'double brace' di Java, itu adalah dua blok yang diformat dengan sengaja seperti ini.

Dengan pendakap luar, kami mengisytiharkan kelas dalaman tanpa nama yang akan menjadi subkelas ArrayList . Di dalam pendakap ini, kami dapat menyatakan perincian subkelas kami.

Seperti biasa, kita dapat menggunakan blok inisialisasi contoh dan dari situlah pasangan pendakap dalaman berasal.

Singkatnya sintaks ini menggoda namun dianggap sebagai anti-corak.

Untuk membaca lebih lanjut mengenai permulaan dua pendakap, lihat artikel kami di sini.

6. Kesimpulannya

Java moden menawarkan beberapa pilihan untuk membuat Koleksi dalam satu baris. Kaedah yang kami pilih hampir sepenuhnya bergantung pada pilihan peribadi, dan bukannya alasan teknikal.

Yang penting ialah, walaupun kelihatan anggun, anti-corak inisialisasi kelas dalaman tanpa nama (aka 'double brace') mempunyai banyak kesan sampingan negatif .

Seperti biasa, kodnya tersedia di GitHub.