Java Null-Safe Streams dari Koleksi

1. Ikhtisar

Dalam tutorial ini, kita akan melihat cara membuat aliran aman-null dari koleksi Java.

Untuk memulainya, beberapa keakraban dengan Referensi Metode Java 8, Ekspresi Lambda, Opsional , dan API Streaming diperlukan untuk memahami materi ini sepenuhnya.

Jika Anda tidak terbiasa dengan salah satu topik ini, silakan lihat artikel kami sebelumnya terlebih dahulu: Fitur Baru di Java 8, Panduan Untuk Java 8 Opsional dan Pengantar Aliran Java 8.

2. Ketergantungan Maven

Sebelum kita mulai, ada satu ketergantungan Maven yang akan kita perlukan untuk skenario tertentu:

 org.apache.commons commons-collections4 4.2 

The commons-collections4 perpustakaan dapat didownload dari Maven Central.

3. Membuat Aliran dari Koleksi

Pendekatan dasar untuk membuat Stream dari semua jenis Collection adalah dengan memanggil metode stream () atau parallelStream () pada koleksi bergantung pada jenis aliran yang diperlukan:

Collection collection = Arrays.asList("a", "b", "c"); Stream streamOfCollection = collection.stream(); 

Koleksi kami kemungkinan besar akan memiliki sumber eksternal di beberapa titik, kami mungkin akan berakhir dengan metode yang mirip dengan yang di bawah ini saat membuat aliran dari koleksi:

public Stream collectionAsStream(Collection collection) { return collection.stream(); } 

Ini dapat menyebabkan beberapa masalah. Jika koleksi yang diberikan menunjuk ke referensi null , kode tersebut akan menampilkan NullPointerException saat waktu proses.

Bagian berikut membahas bagaimana kita dapat melindungi dari ini.

4. Membuat Aliran Koleksi yang Dibuat Null-Safe

4.1. Tambahkan Cek ke Prevent Null Dereferences

Untuk mencegah pengecualian penunjuk null yang tidak diinginkan , kita dapat memilih untuk menambahkan pemeriksaan untuk mencegah referensi null saat membuat aliran dari koleksi:

Stream collectionAsStream(Collection collection) { return collection == null ? Stream.empty() : collection.stream(); } 

Namun, metode ini memiliki beberapa masalah.

Pertama, pemeriksaan nol menghalangi logika bisnis yang mengurangi keterbacaan program secara keseluruhan.

Kedua, penggunaan null untuk merepresentasikan ketiadaan nilai dianggap sebagai pendekatan yang salah pasca-Java SE 8: Ada cara yang lebih baik untuk memodelkan ketiadaan dan keberadaan nilai.

Penting untuk diingat bahwa Koleksi kosong tidak sama dengan Koleksi null . Sementara yang pertama menunjukkan bahwa kueri kami tidak memiliki hasil atau elemen untuk ditampilkan, yang kedua menunjukkan bahwa semacam kesalahan baru saja terjadi selama proses tersebut.

4.2. Gunakan Metode emptyIfNull dari CollectionUtils Library

Kami dapat memilih untuk menggunakan perpustakaan CollectionUtils Apache Commons untuk memastikan aliran kami aman dari nol . Pustaka ini menyediakan metode emptyIfNull yang mengembalikan koleksi kosong tetap yang diberi koleksi null sebagai argumen, atau koleksi itu sendiri sebaliknya:

public Stream collectionAsStream(Collection collection) { return emptyIfNull(collection).stream(); } 

Ini adalah strategi yang sangat sederhana untuk diterapkan. Namun, itu tergantung pada pustaka eksternal. Jika kebijakan pengembangan perangkat lunak membatasi penggunaan pustaka semacam itu, maka solusi ini akan dianggap batal demi hukum.

4.3. Gunakan Opsional Java 8

Opsional Java SE 8 adalah wadah nilai tunggal yang berisi nilai atau tidak. Jika ada nilai yang hilang, penampung Opsional dikatakan kosong.

Menggunakan Opsional bisa dibilang dianggap sebagai strategi keseluruhan terbaik untuk membuat koleksi aman-null dari aliran.

Mari kita lihat bagaimana kita bisa menggunakannya diikuti dengan diskusi singkat di bawah ini:

public Stream collectionToStream(Collection collection) { return Optional.ofNullable(collection) .map(Collection::stream) .orElseGet(Stream::empty); } 
  • Opsional.ofNullable (koleksi) membuatobjek Opsional dari koleksi yang diteruskan. Objek opsional kosongdibuat jika koleksi kosong.
  • map (Collection :: stream) mengekstrak nilai yang terkandung dalamobjek Opsional sebagai argumen kemetode peta ( Collection.stream () )
  • orElseGet (Stream :: empty) mengembalikan nilai fallback jikaobjek Opsional kosong, yaitu koleksi yang diteruskan adalah null .

Akibatnya, kami secara proaktif melindungi kode kami dari pengecualian pointer nol yang tidak diinginkan .

4.4. Gunakan Stream OfNullable Java 9

Memeriksa contoh terner kami sebelumnya di bagian 4.1. dan mempertimbangkan kemungkinan beberapa elemen bisa menjadi null alih-alih Collection , kami memiliki metode ofNullable kami di kelas Stream .

Kami dapat mengubah sampel di atas menjadi:

Stream collectionAsStream(Collection collection) { return collection.stream().flatMap(s -> Stream.ofNullable(s)); }

5. Kesimpulan

Di artikel ini, kami meninjau kembali secara singkat cara membuat aliran dari koleksi tertentu. Kami kemudian melanjutkan untuk mempelajari tiga strategi utama untuk memastikan streaming yang dibuat aman dari nol saat dibuat dari koleksi.

Terakhir, kami menunjukkan kelemahan menggunakan setiap strategi jika relevan.

Seperti biasa, kode sumber lengkap yang menyertai artikel tersedia di GitHub.