Pilih satu elemen
Secara intuitif, memilih satu elemen jelas lebih mudah daripada memilih beberapa elemen, namun ada beberapa masalah di sini. Pertama-tama mari kita lihat apa masalahnya dengan pendekatan umum, lalu lihat cara menggunakan ekspresi lambda untuk menyelesaikannya.
Pertama mari kita buat metode baru untuk menemukan elemen yang dimulai dengan huruf tertentu, lalu mencetaknya.
Copy kode kodenya sebagai berikut:
public static void pickName(
nama Daftar<String> akhir, Huruf awal String akhir) {
String nama ditemukan = null;
for(String nama : nama) {
if(nama.startsWith(startingLetter)) {
Namaditemukan = nama;
merusak;
}
}
Cara ini sama baunya dengan truk sampah yang baru saja lewat. Kami pertama kali membuat variabel foundName baru, dan kemudian menginisialisasinya ke null - ini adalah sumber bau busuk. Kita harus memeriksa apakah nilainya null, jika tidak, NullPointerException atau respons kesalahan akan muncul. Kami juga menggunakan iterator eksternal untuk menelusuri daftar. Jika kami menemukan elemen yang kami inginkan, kami harus keluar dari loop, yang menambah bau aslinya: paranoia tipe dasar, gaya imperatif, mutabilitas, semuanya menjadi hidup. Setelah kita keluar dari loop, kita harus memeriksa hasilnya sebelum mencetak. Tugas sekecil itu sebenarnya membutuhkan kode yang panjang.
Mari kita analisis ulang masalah ini. Kami hanya ingin dapat memilih elemen pertama yang cocok dan menangani kasus di mana tidak ada elemen tersebut dengan aman. Mari kita tulis ulang metode pickName ini menggunakan ekspresi lambda.
Copy kode kodenya sebagai berikut:
public static void pickName(
nama Daftar<String> akhir, Huruf awal String akhir) {
final Opsional<String> foundName =
nama.stream()
.filter(nama ->nama.startsWith(startingLetter))
.findFirst();
System.out.println(String.format("Nama dimulai dengan %s: %s",
startingLetter, foundName.orElse("Tidak ditemukan nama")));
}
Beberapa fungsi canggih di JDK membuat kode ini sangat ringkas. Pertama, kita menggunakan metode filter untuk mendapatkan semua elemen yang memenuhi ketentuan, lalu menggunakan metode findFirst dari kelas Stream untuk memilih elemen pertama dari koleksi yang dikembalikan. Metode ini mengembalikan objek Opsional, yang merupakan pewangi bersertifikat resmi untuk variabel nol di Java.
Kelas Optional sangat berguna, Anda tidak perlu khawatir apakah hasilnya ada atau tidak. Ini menyelamatkan kita dari masalah pengecualian penunjuk nol dan memperjelas bahwa tidak ada hasil yang mungkin terjadi. Melalui metode isPresent() kita dapat mengetahui apakah hasilnya ada. Jika kita ingin mendapatkan nilai hasil, kita dapat menggunakan metode get(). Kita juga dapat menetapkan nilai defaultnya menggunakan (nama metode ini akan mengejutkan Anda) metode orElse, seperti pada kode sebelumnya.
Kami menggunakan koleksi teman yang telah kami gunakan sebelumnya untuk memverifikasi metode pickName kami.
Copy kode kodenya sebagai berikut:
pickName(teman, "N");
pickName(teman, "Z");
Kode ini memilih elemen pertama yang cocok dan mencetak pesan ramah jika tidak ditemukan.
Copy kode kodenya sebagai berikut:
Nama yang dimulai dengan N: Nate
Nama yang dimulai dengan Z: Tidak ditemukan nama
Kombinasi metode findFirst() dan kelas Optinal mengurangi jumlah kode kita dan terlihat bagus. Namun fungsi dari kelas Optional lebih dari itu. Misalnya, selain memberikan nilai default ketika objek tidak ada, Anda juga dapat menggunakannya untuk menjalankan sepotong kode, atau ekspresi lambda, jika hasilnya ada, seperti ini:
Copy kode kodenya sebagai berikut:
foundName.ifPresent(nama -> System.out.println("Halo " + nama));
Dibandingkan dengan kode penting dalam memilih nama pertama yang cocok, gaya aliran fungsional yang elegan terlihat lebih baik. Namun apakah ada terlalu banyak hal yang dapat dilakukan dalam alur panggilan versi ini? Tentu saja tidak, metode ini sangat cerdas dan bekerja sesuai permintaan (kita akan mempelajarinya secara mendalam di Evaluasi Aliran Malas di halaman 113).
Contoh pemilihan elemen tunggal menunjukkan fungsi perpustakaan JDK yang lebih canggih. Mari kita lihat bagaimana ekspresi lambda dapat menemukan nilai yang diinginkan berdasarkan koleksi.