Skip to main content

Lazy Evaluation

Stream secara default adalah lazy, Stream tidak akan mengalirkan data jika belum menggunakan terminal operation. Selain itu, data hanya akan dialirkan seperlunya saja, tergantung terminal operation nya.

Intermediate Operations & Terminal Operations

Secara garis besar, ada 2 jenis Stream Operation, yaitu Intermediate dan Terminal Operations. Intermediate Operations merupakan lazy operation, dimana Stream tidak akan dieksekusi sampai memang dibutuhkan. Sedangkan Terminal Operations merupakan operasi yang mentrigger sebuah Stream berjalan. Karena Intermediate Operations adalah lazy, maka secara garis besar, semua Intermediate Operations akan mengembalikan Stream lagi

Intermediate Operations

Intermediate operations bersifat lazy operations yang berfungsi:

  1. Mengubah atau memfilter elemen dalam aliran
  2. Tidak dapat menghasilkan hasil akhir sampai Terminal Operation dipanggil
  3. Dapat dirantai untuk membangun alur stream pipeline

Method Intermediate Operation yang sering digunakan

  • filter()
  • map()
  • flatMap()
  • distinct()
  • sorted()
  • peek()
  • limit()
  • skip()
  • takeWhile() (Java 9+)
  • dropWhile() (Java 9+)

Contoh:

List<String> animals = List.of("Kucing", "Anjing", "Ayam", "Kambing", "Sapi");

// Intermediate Operations akan mengembalikan Stream lagi
Stream<String> streamList = animals.stream()
.map(data -> {
System.out.println("Change : " + data + "to Uppercase");
return data.toUpperCase();
});

Terminal Operations

Terminal Operations adalah final step dalam stream pipeline, yang bersifat:

  • Menghasilkan result (collection, number, boolean, dll.)
  • Akan melakukan Trigger stream execution
  • Akan melakukan Consume terhadap stream (stream tidak dapat digunakan kembali)

Method Terminal Operation yang sering digunakan

OperationsDescriptionReturn Type
forEach()Menerapkan tindakan pada setiap itemvoid
toArray()Konversi elemen stream ke arrayT[]
collect()Menerapkan elemen ke Collection/map/stringR(varies)
reduce()Melakukan reduksi pada elemen menggunakan operator binerOptional<T> or <T>
min()Nilai minimum dari comparatorOptional<T>
max()Nilai maximal dari comparatorOptional<T>
count()Jumlah elementlong
anyMatch()Mengembalikan true jika ada elemen cocok dengan predicate yang diberikanboolean
allMatch()Mengembalikan true jika semua elemen cocok dengan predicate yang diberikanboolean
noneMatch()Mengembalikan true jika tidak ada elemen cocok dengan predicate yang diberikanboolean
findFirst()Mengembalikan elemen pertama (jika ada)Optional<T>
findAny()Mengembalikan elemen apapunOptional<T>

Contoh:

List<String> animals = List.of("Kucing", "Anjing", "Ayam", "Kambing", "Sapi");

// Membuat Stream dengan Intermediate Operations yang di akhiri dengan Terminal Operations
animals.stream()
.map(data -> {
System.out.println("Change : " + data + " to Uppercase");
return data.toUpperCase();
}).map((data) -> {
System.out.println("Hewan " + data + " diubah");
return "Hello " + data;
}).forEach(System.out::println);