Pertanyaan Mengonversi susunan ke daftar di Java


Bagaimana cara mengonversi larik ke daftar di Java?

Saya menggunakan Arrays.asList() tetapi perilaku (dan tanda tangan) entah bagaimana berubah dari Java SE 1.4.2 (dokumen sekarang dalam arsip) ke 8 dan kebanyakan cuplikan yang saya temukan di web menggunakan perilaku 1.4.2.

Sebagai contoh:

int[] spam = new int[] { 1, 2, 3 };
Arrays.asList(spam)
  • pada 1.4.2 mengembalikan daftar yang berisi elemen 1, 2, 3
  • pada 1.5.0+ mengembalikan daftar yang berisi larik spam

Dalam banyak kasus itu harus mudah dideteksi, tetapi kadang-kadang dapat tergelincir tanpa disadari:

Assert.assertTrue(Arrays.asList(spam).indexOf(4) == -1);

752
2018-04-09 12:20


asal


Jawaban:


Dalam contoh Anda, itu karena Anda tidak dapat memiliki Daftar tipe primitif. Dengan kata lain, List<int> itu tidak mungkin. Anda dapat, bagaimanapun, memiliki List<Integer>.

Integer[] spam = new Integer[] { 1, 2, 3 };
Arrays.asList(spam);

Itu bekerja sesuai harapan.


1100
2018-04-09 12:27



Masalahnya adalah vararg diperkenalkan di Java5 dan sayangnya, Arrays.asList() terlalu dibebani dengan versi vararg juga. Begitu Arrays.asList(spam) dipahami oleh compiler Java5 sebagai parameter vararg dari int array.

Masalah ini dijelaskan lebih detail pada Java Ed 2 Efektif, Bab 7, Item 42.


111
2018-04-09 12:26



Berbicara tentang cara konversi, itu tergantung pada mengapa Anda membutuhkannya List. Jika Anda membutuhkannya hanya untuk membaca data. Oke, ini dia:

Integer[] values = { 1, 3, 7 };
List<Integer> list = Arrays.asList(values);

Tetapi kemudian jika Anda melakukan sesuatu seperti ini:

list.add(1);

Anda mendapatkan java.lang.UnsupportedOperationException. Jadi untuk beberapa kasus Anda bahkan membutuhkan ini:

Integer[] values = { 1, 3, 7 };
List<Integer> list = new ArrayList<Integer>(Arrays.asList(values));

Pendekatan pertama sebenarnya tidak mengonversi array tetapi 'mewakili' itu seperti a List. Tetapi array berada di bawah tenda dengan semua propertinya seperti jumlah elemen tetap. Harap dicatat Anda perlu menentukan jenis ketika membangun ArrayList.


105
2017-09-27 16:22



Di Java 8, Anda dapat menggunakan streaming:

int[] spam = new int[] { 1, 2, 3 };
Arrays.stream(spam)
      .boxed()
      .collect(Collectors.toList());

93
2018-05-16 23:49



Tampaknya sedikit terlambat tetapi di sini adalah dua sen saya. Kami tidak bisa List<int> sebagai int adalah tipe primitif sehingga kita hanya bisa memilikinya List<Integer>.

Java 8 (int array)

int[] ints = new int[] {1,2,3,4,5};
List<Integer> list11 =Arrays.stream(ints).boxed().collect(Collectors.toList()); 

Java 8 dan di bawahnya (Integer array)

Integer[] integers = new Integer[] {1,2,3,4,5};
List<Integer> list21 =  Arrays.asList(integers); // Cannot modify returned list
List<Integer> list22 = new ArrayList<>(Arrays.asList(integers)); // good
List<Integer> list23 = Arrays.stream(integers).collect(Collectors.toList()); //Java 8 only

Perlu ArrayList dan bukan Daftar?

Dalam hal kami menginginkan implementasi khusus List misalnya ArrayList maka kita bisa menggunakannya toCollection sebagai:

ArrayList<Integer> list24 = Arrays.stream(integers)
                          .collect(Collectors.toCollection(ArrayList::new));

Mengapa list21 tidak dapat dimodifikasi secara struktural?

Saat kami gunakan Arrays.asList ukuran daftar yang dikembalikan sudah diperbaiki karena daftar yang dikembalikan tidak java.util.ArrayList, tetapi kelas statis pribadi didefinisikan di dalam java.util.Arrays. Jadi jika kita menambahkan atau menghapus elemen dari daftar yang dikembalikan, sebuah UnsupportedOperationException akan dilemparkan. Jadi kita harus pergi bersama list22 ketika kami ingin memodifikasi daftar. Jika kita memiliki Java8 maka kita juga bisa ikut list23.

Untuk menjadi jelas list21 dapat dimodifikasi dalam arti bahwa kita dapat memanggil list21.set(index,element) tetapi daftar ini mungkin tidak dimodifikasi secara struktural, yaitu tidak dapat menambah atau menghapus elemen dari daftar. Anda juga dapat memeriksa ini pertanyaan.

Jika kita menginginkan daftar yang tidak dapat diubah maka kita dapat membungkusnya sebagai:

List<Integer> list 22 = Collections.unmodifiableList(Arrays.asList(integers));

50
2017-12-23 05:07



Saya baru-baru ini harus mengubah array ke Daftar. Kemudian program memfilter daftar berusaha untuk menghapus data. Saat Anda menggunakan fungsi Arrays.asList (array), Anda membuat koleksi ukuran tetap: Anda tidak dapat menambah atau menghapus. Entri ini menjelaskan masalah dengan lebih baik daripada yang saya dapat: Mengapa saya mendapatkan UnsupportedOperationException saat mencoba menghapus elemen dari Daftar?.

Pada akhirnya, saya harus melakukan konversi "manual":

    List<ListItem> items = new ArrayList<ListItem>();
    for (ListItem item: itemsArray) {
        items.add(item);
    }

Saya kira saya bisa menambahkan konversi dari array ke daftar menggunakan operasi List.addAll (item).


8
2017-08-31 17:26



Lebih pendek lagi:

List<Integer> list = Arrays.asList(1, 2, 3, 4);

6
2018-03-17 09:55