Mengonversi Koleksi ke ArrayList di Java

1. Ikhtisar

Mengonversi koleksi Java dari satu jenis ke jenis lainnya adalah tugas pemrograman umum. Dalam tutorial ini, kami akan mengonversi semua jenis Collection ke ArrayList .

Sepanjang tutorial, kami akan berasumsi bahwa kami sudah memiliki koleksi objek Foo . Dari sana, kami akan membuat ArrayList menggunakan berbagai pendekatan.

2. Mendefinisikan Teladan Kita

Tetapi sebelum melanjutkan, mari kita buat model input dan output kita.

Sumber kami dapat berupa semua jenis koleksi jadi kami akan mendeklarasikannya menggunakan antarmuka Koleksi :

Collection srcCollection; 

Kita perlu membuat ArrayList dengan tipe elemen yang sama:

ArrayList newList;

3. Menggunakan ArrayList Constructor

Cara termudah untuk menyalin koleksi ke koleksi baru menggunakan konstruktornya.

Dalam panduan kami sebelumnya untuk ArrayList, kami mempelajari bahwa konstruktor ArrayList dapat menerima parameter collection:

ArrayList newList = new ArrayList(srcCollection);
  • ArrayList baru berisi salinan dangkal dari elemen Foo di koleksi sumber.
  • Urutannya sama dengan urutan di koleksi sumber.

Kesederhanaan konstruktor menjadikannya pilihan yang bagus di sebagian besar skenario.

4. Menggunakan Streams API

Sekarang, mari manfaatkan Streams API untuk membuat ArrayList dari Koleksi yang ada :

ArrayList newList = srcCollection.stream().collect(toCollection(ArrayList::new));

Dalam cuplikan ini:

  • Kami mengambil aliran dari koleksi sumber dan menerapkan operator collect () untuk membuat Daftar
  • Kami menetapkan ArrayList :: new untuk mendapatkan tipe daftar yang kami inginkan
  • Kode ini juga akan menghasilkan salinan yang dangkal.

Jika kami tidak khawatir tentang jenis Daftar yang tepat , kami dapat menyederhanakan:

List newList = srcCollection.stream().collect(toList());

Perhatikan bahwa toCollection () dan toList () diimpor secara statis dari Collectors . Untuk mempelajari lebih lanjut, silakan merujuk ke panduan kami tentang Kolektor Java 8.

5. Salinan Dalam

Sebelumnya kami menyebutkan "salinan dangkal". Yang kami maksud adalah bahwa elemen dalam daftar baru persis sama dengan instance Foo yang masih ada di koleksi sumber. Oleh karena itu, kami telah menyalin Foo ke Daftar baru dengan referensi.

Jika kita memodifikasi konten instance Foo di salah satu koleksi, modifikasi itu akan tercermin di kedua koleksi . Oleh karena itu, jika kita ingin memodifikasi elemen di salah satu koleksi tanpa memodifikasi yang lain, kita perlu melakukan "salinan dalam".

Untuk menyalin Foo secara mendalam , kami membuat instance Foo yang benar-benar baru untuk setiap elemen . Akibatnya, semua kolom Foo perlu disalin ke instance baru.

Mari kita definisikan kelas Foo kita sehingga ia tahu cara menyalin dirinya sendiri:

public class Foo { private int id; private String name; private Foo parent; public Foo(int id, String name, Foo parent) { this.id = id; this.name = name; this.parent = parent; } public Foo deepCopy() { return new Foo( this.id, this.name, this.parent != null ? this.parent.deepCopy() : null); } }

Disini kita bisa melihat field id dan name adalah int dan String . Tipe data ini disalin berdasarkan nilai. Oleh karena itu, kami dapat menetapkan keduanya.

Bidang induk adalah Foo lain , yang merupakan kelas. Jika Foo dimutasi, kode apa pun yang membagikan referensi tersebut akan terpengaruh oleh perubahan ini. Kami harus menyalin dalam bidang induk .

Sekarang kita bisa kembali ke konversi ArrayList kita . Kami hanya membutuhkan operator peta untuk memasukkan salinan dalam ke aliran:

ArrayList newList = srcCollection.stream() .map(foo -> foo.deepCopy()) .collect(toCollection(ArrayList::new));

Kami dapat mengubah konten dari salah satu koleksi tanpa mempengaruhi yang lain.

Salinan dalam bisa menjadi proses yang panjang tergantung pada jumlah elemen dan kedalaman data. Menggunakan aliran paralel di sini dapat memberikan peningkatan kinerja jika diperlukan.

6. Mengontrol Urutan Daftar

Secara default, aliran kami akan mengirimkan elemen ke ArrayList kami dalam urutan yang sama seperti yang ditemui di koleksi sumber.

Jika kita ingin mengubah urutan itu, kita bisa menerapkan operator sort () ke aliran . Untuk mengurutkan objek Foo kami berdasarkan nama:

ArrayList newList = srcCollection.stream() .sorted(Comparator.comparing(Foo::getName)) .collect(toCollection(ArrayList::new));

Kami dapat menemukan detail lebih lanjut tentang pemesanan aliran di tutorial sebelumnya ini.

7. Kesimpulan

The ArrayList konstruktor adalah cara yang efektif untuk mendapatkan isi dari Collection menjadi baru ArrayList .

However, if we need to tweak the resulting list, the Streams API provides a powerful way to modify the process.

The code used in this article can be found in its entirety over on GitHub.