1. Memeriksa
Saya pikir Anda mungkin sudah bosan mempelajari cara menyatukan aliran data. Anda ingin akhirnya melakukan sesuatu dengan data.
Kelas Stream
memiliki tiga metode standar yang tidak membuat aliran, tetapi memeriksa jenis data apa yang ada di dalamnya. Metode-metode ini adalah: anyMatch()
, allMatch()
, dan noneMatch()
.
boolean anyMatch(rule)
metode
Metode ini memeriksa apakah aliran memiliki setidaknya satu elemen yang memenuhi aturan yang diteruskan ke metode. Jika ada elemen seperti itu, metode mengembalikan true
, jika tidak false
.
Contoh
Kode | Catatan |
---|---|
|
|
|
|
|
|
Pada contoh terakhir, pertama-tama kita mempertahankan hanya elemen yang kurang dari nol, lalu kita memeriksa hasilnya untuk melihat apakah ada elemen yang difilter lebih besar dari nol. Tentu saja, elemen seperti itu sudah tidak ada lagi.
metode boolean allMatch(rule).
Metode ini memeriksa apakah semua elemen dalam aliran cocok dengan aturan (juga dikenal sebagai predikat). Aturan diteruskan sebagai argumen ke metode:
Kode | Catatan |
---|---|
|
(semua elemen lebih besar dari nol) |
|
(apakah ada elemen yang kurang dari atau sama dengan nol?) |
|
(kami mempertahankan elemen yang kurang dari nol) |
Dalam contoh terakhir, pertama-tama kita hanya mengizinkan elemen yang kurang dari nol untuk melewati filter, lalu kita memeriksa apakah semua elemen yang dipertahankan kurang dari nol. Pemeriksaan tersebut memberikan hasil yang positif.
metode boolean noneMatch(rule).
Metode noneMatch()
memeriksa apakah aliran tidak memiliki elemen yang cocok dengan aturan yang diteruskan. Ini seperti kebalikan dari anyMatch()
metode.
Kode | Catatan |
---|---|
|
|
|
|
|
|
2. Kelas utilitas: Optional
kelas
Terkadang sangat merepotkan bagi pemrogram untuk bekerja dengan null
referensi. Misalnya, Anda membandingkan dua string. Jika kedua variabel tidak null
, maka Anda cukup memanggil s1.equals(s2)
, dan semuanya akan berfungsi. Tapi jika s1
bisa null
, maka Anda harus menulis kode yang menangani situasi ini untuk menghindari NullPointerException
.
Itu sebabnya programmer datang dengan Optional<T>
kelas utilitas. Kodenya kira-kira seperti ini:
Kode | Catatan |
---|---|
|
Memeriksa apakah nilainya tidak null Memeriksa apakah nilainya null Mengembalikan nilai yang disimpan. Melempar pengecualian jika nilainya nol. Mengembalikan nilai non-null yang disimpan. Atau jika nilai yang disimpan adalah null , maka kembalikan nilai yang diteruskan sebagai argumen metode Mengembalikan nilai non-null yang disimpan atau melontarkan pengecualian jika nilainya nol. |
Tujuan kelas ini hanya untuk menyimpan objek T (referensi ke objek yang bertipe T). Referensi objek di dalam suatu Optional<T>
objek dapat berupa null
.
Kelas ini memungkinkan pemrogram menulis kode yang sedikit lebih cantik. Mari kita bandingkan:
Menggunakan Opsional | Tidak menggunakan Opsional |
---|---|
|
|
Satu Optional
objek selalu dapat dibandingkan dengan Optional
objek lain menggunakan equals
metode ini, bahkan jika mereka menyimpan null
referensi.
Sederhananya, Optional
kelas memungkinkan Anda menulis cek "indah" untuk null
dan tindakan "indah" jika suatu Optional
objek menyimpan null
nilai.
3. Menemukan elemen
Ayo kembali ke Stream
kelas. Kelas Stream
memiliki 4 metode lagi yang memungkinkan Anda mencari elemen dalam aliran. Metode tersebut adalah findFirst()
, findAny()
, min()
, dan max()
.
Optional<T> findFirst()
metode
Metode ini findFirst()
hanya mengembalikan elemen pertama dalam aliran. Itu saja.
Hal yang lebih menarik untuk diperhatikan di sini adalah bahwa metode ini tidak mengembalikan objek T
, melainkan Optional<T>
objek pembungkus. Ini memastikan bahwa metode tidak akan pernah kembali null
setelah gagal menemukan objek.
Contoh:
ArrayList<String> list = new ArrayList<String>();
Collections.addAll(list, "Hello", "how's", "life?");
String str = list.stream().findFirst().get(); // Hello
Untuk lebih memperjelas, mari kita pisahkan baris terakhir menjadi beberapa baris:
ArrayList<String> list = new ArrayList<String>();
Collections.addAll(list, "Hello", "how's", "life?");
Stream<String> stream = list.stream();
Optional<String> result = stream.findFirst();
String str = result.get(); // Hello
Metode terakhir get()
hanya mengambil nilai yang disimpan di dalam Optional
objek.
Optional<T> findAny()
metode
Metode findAny()
mengembalikan elemen apa pun dari aliran dan berakhir di sana. Metode ini mirip dengan findFirst()
, tetapi bagus untuk aliran yang digunakan dalam operasi paralel.
Saat memproses aliran secara paralel, mungkin elemen telah ditemukan di beberapa bagian aliran, tetapi belum jelas apakah itu yang pertama atau bukan.
Jika banyak elemen cocok dengan semua filter, dan penting bagi programmer untuk mendapatkan yang pertama, maka metode findFirst()
inilah yang harus dipanggil. Jika pemrogram mengetahui bahwa pada kenyataannya 0 atau 1 elemen akan cocok dengan semua filter, maka cukup dengan menelepon findAny()
— dan ini akan lebih cepat.
Optional<T> min(Comparator<T>)
metode
Metode ini min()
menggunakan comparator
objek untuk membandingkan semua elemen dalam aliran dan mengembalikan elemen minimum. Cara paling mudah untuk mendefinisikan objek pembanding adalah dengan fungsi lambda.
Contoh pencarian string terpendek:
ArrayList<String> list = new ArrayList<String>();
Collections.addAll(list, "Hello", "how's", "life?");
String min = list.stream().min( (s1, s2)-> s1.length()-s2.length() ).get();
Optional<T> max(Comparator<T>)
metode
Metode ini max()
menggunakan comparator
objek untuk membandingkan semua elemen dalam aliran dan mengembalikan elemen maksimum. Cara paling mudah untuk mendefinisikan objek pembanding adalah dengan fungsi lambda.
Contoh pencarian string terpanjang:
ArrayList<String> list = new ArrayList<String>();
Collections.addAll(list, "Hello", "how's", "life?");
String max = list.stream().max( (s1, s2)-> s1.length()-s2.length() ).get();
GO TO FULL VERSION