1. Memeriksa

Saya pikir Anda mungkin sudah bosan mempelajari cara menyatukan aliran data. Anda ingin akhirnya melakukan sesuatu dengan data.

Kelas Streammemiliki 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
Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5);
boolean result = stream.anyMatch(x -> x > 0);

true
Stream<Integer> stream = Stream.of(1, -2, 3, -4, 5);
boolean result = stream.anyMatch(x -> x > 0);

true
Stream<Integer> stream = Stream.of(1, -2, 3, -4, 5);
boolean result = stream.filter(x -> x < 0).anyMatch(x -> x > 0);

false

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
Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5);
boolean result = stream.allMatch(x -> x > 0);
true
(semua elemen lebih besar dari nol)
Stream<Integer> stream = Stream.of(1, -2, 3, -4, 5);
boolean result = stream.allMatch(x -> x > 0);
false
(apakah ada elemen yang kurang dari atau sama dengan nol?)
Stream<Integer> stream = Stream.of(1, -2, 3, -4, 5);
boolean result = stream.filter(x -> x < 0).allMatch(x -> x < 0);
true
(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
Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5);
boolean result = stream.noneMatch(x -> x > 0);

false
Stream<Integer> stream = Stream.of(1, -2, 3, -4, 5);
boolean result = stream.noneMatch(x -> x > 0);

false
Stream<Integer> stream = Stream.of(1, -2, 3, -4, 5);
boolean result = stream.filter(x -> x < 0).noneMatch(x -> x > 0);

true


2. Kelas utilitas: Optionalkelas

Terkadang sangat merepotkan bagi pemrogram untuk bekerja dengan nullreferensi. Misalnya, Anda membandingkan dua string. Jika kedua variabel tidak null, maka Anda cukup memanggil s1.equals(s2), dan semuanya akan berfungsi. Tapi jika s1bisa 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
class Optional<Type>
{
   private final Type value;
   private Optional() { this.value = null;}
   private Optional(value) { this.value = value;}
   public static <Type> Optional<Type> of(Type value)
   {
      return new Optional<Type>(value);
   }

   public boolean isPresent()
   {
      return value != null;
   }

   public boolean isEmpty()
   {
      return value == null;
   }

   public Type get()
   {
      if (value == null)
      {
         throw new NoSuchElementException();
      }
      return value;
   }

   public Type orElse(Type other)
   {
      return value != null ? value : other;
   }

   public Type orElseThrow()
   {
      if (value == null)
      {
         throw new NoSuchElementException();
      }
      return value;
   }
}










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
public void printString(String s)
{
   Optional<String> str = Optional.ofNullable(s);
   System.out.println(str.orElse(""));
}
public void printString(String s)
{
   String str = s != null ? s : "";
   System.out.println(str)
}

Satu Optionalobjek selalu dapat dibandingkan dengan Optionalobjek lain menggunakan equalsmetode ini, bahkan jika mereka menyimpan nullreferensi.

Sederhananya, Optionalkelas memungkinkan Anda menulis cek "indah" untuk nulldan tindakan "indah" jika suatu Optionalobjek menyimpan nullnilai.



3. Menemukan elemen

Ayo kembali ke Streamkelas. Kelas Streammemiliki 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 nullsetelah 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 Optionalobjek.

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 comparatorobjek 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 comparatorobjek 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();