Apa itu Java Stream?
Java Stream diperkenalkan pertama kali di Java versi 8 atau 1.8. Java Stream adalah alur elemen yang mendukung operasi fungsional seperti filtering, mapping, dan looping.
🤔 Fitur Java Stream
Streambukan struktur data — tidak menyimpan apa pun — tetapi beroperasi pada data dari collection, array, atau input I/O.Streambersifat fungsional. Operasi yang dilakukan padaStreamtidak mengubah data sumbernya. Misalnya, melakukan filter padaStreamyang diperoleh dari suatuCollectionakan menghasilkanStreambaru tanpa elemen yang difilter, tanpa menghapus elemen dari sumberCollection.Streambersifat lazy dan akan memproses kode program hanya ketika ketika diperlukan.- Elemen-elemen pada
Streamhanya dijalankan satu kali selamaStreamtersebut berlangsung. Seperti padaIterator,Streambaru harus dihasilkan untuk mmenjalankan kembali elemen-elemen yang sama dari sumbernya.

source: https://logicmojo.com/java8-feature-questions
📚 Konsep Stream Pipeline
Konsep Stream Pipeline adalah penghubung antar operasi/operation. Operasi pada Stream pipeline terbagi menjadi dua kategori:
- Intermediate Operations
- Terminal Operations
Setiap Intermediate Operations akan mengembalikan nilai Stream lagi. Akibatnya, kita dapat membuat pipeline pemrosesan dengan jumlah Intermediate Operations secara bebas untuk memproses data.
Stream kemudian harus dihentikan menggunakan Terminal Operations yang mengembalikan nilai akhir.

source: https://logicmojo.com/java8-feature-questions
1️⃣ Java Stream Intermediate Operations
Intermediate operations bersifat lazy operations yang berfungsi:
- Mengubah atau memfilter elemen dalam aliran
- Tidak dapat menghasilkan hasil akhir sampai Terminal Operation dipanggil
- 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+)
2️⃣ Java Stream 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
| Operations | Description | Return Type |
|---|---|---|
forEach() | Menerapkan tindakan pada setiap item | void |
toArray() | Konversi elemen stream ke array | T[] |
collect() | Menerapkan elemen ke Collection/map/string | R(varies) |
reduce() | Melakukan reduksi pada elemen menggunakan operator biner | Optional<T> or <T> |
min() | Nilai minimum dari comparator | Optional<T> |
max() | Nilai maximal dari comparator | Optional<T> |
count() | Jumlah element | long |
anyMatch() | Mengembalikan true jika ada elemen cocok dengan predicate yang diberikan | boolean |
allMatch() | Mengembalikan true jika semua elemen cocok dengan predicate yang diberikan | boolean |
noneMatch() | Mengembalikan true jika tidak ada elemen cocok dengan predicate yang diberikan | boolean |
findFirst() | Mengembalikan elemen pertama (jika ada) | Optional<T> |
findAny() | Mengembalikan elemen apapun | Optional<T> |
Di bawah ini merupakan properties class Stream pada paket java.util.stream di Java 21. Method kemungkinan akan bertambah di kemudian hari, seiring peningkatan versi Java.

Sifat Java Stream
Secara default, Stream itu bersifat Cold, artinya data di Stream tidak akan mengalir sampai kita memintanya. Ada banyak cara untuk meminta Stream mulai mengalirkan datanya, dengan menggunakan Stream Operations. Stream hanya bisa jalan sekali, mirip seperti aliran data, setelah mengalir, aliran data tidak bisa diulang lagi dari awal.