Java Fungsional - Reduce - Part 3
Pendahuluan
Untuk pendahuluan Fungsional Reduce ini bisa dilihat di Java - Fungsional - Reduce - Part 1
Mengenai identiy dapat dilihat di Java - Fungsional - Reduce - Part 2
Kita masih akan berlanjut dengan komponen pertama dari reduction yaitu Identity.
1. Identity (lanjutan)
Kita ulang lagi :
Identity adalah nilai awal atau nilai default ketika Collection nya kosong.
Secara sederhana, jika a adalah identity, maka ketika diterapkan operasi biner antara setiap elemen Collection dengan nilai a, maka nilai elemen collection tadi tidak berubah
- identity untuk penjumlahan adalah 0, karena 0 ditambah nilai apapun akan mengembalikan nilai itu kembali.
- identity untuk perkalian adalah 1, karena 1 dikali nilai apapun akan mengembalikan nilai itu kembali.
- dll.
contoh code :
1import java.util.List;
2
3public class DemoReduce {
4
5 public static void main(String[] args) {
6
7 List<Integer> nilaiMahasiswa = List.of(80,65,76,10);
8
9 Integer minValue = nilaiMahasiswa
10 .parallelStream()
11 .reduce(0, (a, b) -> a + b);
12 System.out.println(minValue);
13 }
14}
Dengan menambahkan identity, maka kita bisa langsung mendapatkan nilai Integer yang diinginkan.
Wajar dong, karena kalau tidak ada data di dalam list, maka yang dikembalikan adalah nilai identity.
Sementara kalau kita tidak menambahkan identity sebagai nilai awal atau default, maka stream.reduce akan mengembalikan nilai Optional
Dan wajar juga dong, karena bisa saja Collectionnya kosong, sehingga tidak ada nilai kembalian nya dan karena kita juga tidak menset nilai awal atau nilai default kalau Collectionnya kosong.
Oleh karena itu ketika menerapkan fungsi stream.reduce ini, maka kita mesti :
- memanggil fungsi .get() , ketika kita tidak menambahkan identity ke dalam fungsi stream.reduce kita tadi.
- tidak perlu memanggil fungsi .get() , ketika kita menambahkan identity ke dalam fungsi stream.reduce kita tadi.
1// tanpa identity
2Integer minValue = nilaiMahasiswa
3 .reduce(0, (a, b) -> a + b)
4 .get();
5
6 // dengan identity
7 Integer minValue = nilaiMahasiswa
8 .reduce(0, (a, b) -> a + b);
2. Accumulator
Akumulator merupakan fungsi utama dari Stream.reduce, yaitu yang melakukan proses kombinasi.
Terdiri dari 2 komponen/variable juga , yaitu :
- variabel untuk menampung hasil akumulasi sementara.
- data selanjutnya dari Stream of Collection
Contoh notasinya, misalnya untuk penjumlahan / sum() :
(a,b) -> a + b
artinya :
dengan a sebagai hasil sementara, dan b sebagai next element, maka tambahkan a dengan b, kemudian simpan datanya di a lagi. Lalu maju satu data lagi. Ulangi sampai akhir dari data yang ada di Collections.
contoh dari code diatas :
1Integer minValue = nilaiMahasiswa
2 .reduce(0, (a, b) -> a + b);
3 }
4}
3. Combiner
Combiner adalah fungsi opsional di stream.reduce.
Biasanya digunakan ketika kita melakukan pemrosesan secara paralel.
Atau juga kalau kita perlu melakukan mapping data dari sebuah tipe ke tipe yang lain, kemudian dilakukan reduction.
Combiner ini digunakan sebagai pelengkap dari fungsi identity dan accumulator.
Pembahasannya di artikel selanjutnya saja.