Pendahuluan

Tipe data List, Set, Queue, Array, dll di dalam Java kita sebut sebagai Collections.

Secara sederhana Collections adalah seperti kumpulan data yang diletakkan berurutan.

Misalnya List of Mahasiswa, berarti kumpulan data Mahasiswa yang berurutan satu dengan yang lainnya.

Kadang kala kita membutuhkan data yang merupakan hasil kesimpulan atau ekstraksi dari seluruh barang/item di collection, misalnya :

  • Mendapatkan nilai terendah (minimum) dari collection, misalnya nilai terendah dari List of Nilai Mahasiswa.
  • Mendapatkan total nilai (sum) dari collection, misalnya total nilai ujian dari List of Nilai Mahasiswa.
  • Mendapatkan nilai rata-rata (average) dari collection, misalnya nilai rata-rata ujian dari List of Nilai Mahasiswa.
  • Mendapatkan daftar nama-nama Mahasiswa saja dari collection, misalnya nama Mahasiswa dari List of Mahasiswa.
  • dll.

Hal diatas bisa kita sebut sebagai fitur Aggregasi.


Apa itu Aggregasi ?


Aggregation is the process of combining things. That is, putting those things together so that we can refer to them collectively

https://study.com/academy/lesson/what-is-aggregation.html

terjemahan bebas

Aggregasi adalah proses untuk melakukan kombinasi untuk sekelompok data.

https://study.com/academy/lesson/what-is-aggregation.html


Jadi Aggregasi sebenarnya merupakan proses dalam melakukan kombinasi untuk sekelompok data.

Proses itu misalnya dilakukan dengan melakukan filter sekelompok data, looping setiap data item, mapping data, mengambil nilai rata-rata dari sekelompok data, dsb.

Aggregasi merupakan sebuah topik yang cukup luas, baik dari sisi konsep dan implementasinya.

Implementasinya juga tidak hanya digunakan di Java saja, tetapi berlaku umum di hampir semua bahasa pemrograman yang lain, javascript, sql, dll.

Aggregasi juga digunakan di tema-tema di seputar Data Science, Big Data, dll.

Contoh-contoh sederhana di bagian pendahuluan, merupakan contoh Aggregasi, tetapi dengan cakupan yang lebih spesifik yang dinamakan Reduction.

Nah inilah yang kita bahas kali ini.


Apa Itu Reduction ?

Sesuai namanya, maka Reduction berarti dari data collections yang banyak tersebut, kita akan melakukan pengurangan/reduction sehingga didapatkan ekstraksi dari data aslinya.

Manggis saja ada ekstraknya, apalagi dengan data.

Tentu lebih banyak lagi yang ingin kita ekstrak dari data yang banyak itu.

Misalnya di contoh sederhana di bagian pendahuluan, kita ingin mendapatkan nilai minimum dari sejumlah nilai-nilai Mahasiswa yang ada.

Atau mendapatkan ekstraksi berupa collection lagi berisikan nama-nama mahasiswa saja dari List of data mahasiswa.


Bagaimana caranya ?

Caranya dengan mengunjungi tiap item/barang yang ada di collection, lalu melakukan kombinasi/perbandingan dari tiap-tiap item/barang tersebut.

Misalnya untuk mencari nilai minimum ujian Mahasiswa, maka kita harus menelusuri masing-masing item di collection, kemudian membandingkan (sebagai proses kombinasi) dengan nilai ujian Mahasiswa lainnya.

Hasil ekstraksi dari proses Reduction ini bisa satu nilai saja atau berbentuk collection lagi.

  • Dalam bentuk satu nilai, seperti nilai maksimum, nilai minimun, nilai rata-rata dari List of nilai Mahasiswa.
  • Dalam bentuk ekstraksi collection baru, seperti mendapatkan List of nama mahasiswa, dari list awalnya yaitu List of Mahasiswa (yang bisa saja terdiri dari nama, alamat, nilai dll)

Dalam Java, pakai fungsi apa ?

Tentunya pakai cara prosedural saja cukup.

Misalnya :

 1import java.util.List;
 2
 3public class DemoReduce {
 4
 5	public static void main(String[] args) {
 6		List<Integer> nilaiMahasiswa = List.of(80,65,76,92,55,77,78);
 7
 8		int minValue = 100;
 9		for (int i=0;i<nilaiMahasiswa.size();i++) {
10			if (nilaiMahasiswa.get(i)<minValue) {
11				minValue = nilaiMahasiswa.get(i);
12			}
13		}
14		System.out.println(minValue);
15	}
16}

Hasilnya :

55

Sederhana kan, di baris ke 14 akan kita dapatkan nilai Minimum dari list nilai Mahasiswa.

Eh tapi kan kita ngebahas fungsional kan ? bukan prosedural kan ya ?

Oh iya, bisa juga kita memakai cara fungsional.

Akan tetapi kalau kita mau memakai fungsional way, maka kita akan dituntut lebih berfikir di level abstraks lagi.


Maksudnya ?

Iya secara konsep kita bisa mendapatkan nilai minimun dari Nilai Mahasiswa diatas dengan cara fungsional.

Di dalam fungsional way, maka kita bisa menganggap Collection itu seperti sebuah kesatuan saja.

Kita tidak fokus kepada penamaan dan iterasi untuk setiap item/barang yang ada di dalam Collection.

Sebuah Collection itu bisa kita anggap sebuah unit saja.

Kemudian kita terapkan/apply fungsi tertentu terhadap Collection itu sebagai sebuah unit.

Terserah di dalamnya apakah memakai logic prosedural, parallel, thread, atau cara lainnya.

Metoda yang berbeda di level bawahnya itu bisa bermacam-macam, karena dengan functional way ini, maka fungsi yang sama bisa diterapkan berulang-ulang misalnya di CPU yang berbeda (untuk kasus eksekusi secara paralel), thread yang berbeda (untuk kasus pakai thread), dll.

Dengan functional way ini, maka optimasi bisa dipilih dari proses diatas secara otomatis oleh JDK nya, atau dipilih oleh kita di logic code kita dengan memanggil fungsi yang sesuai.


Bagaimana caranya dengan cara fungsional ?

Java menyediakan fungsi bernama Stream.reduce sebagai fungsi umum untuk Reduction ini.

Walaupun ada juga fungsi khusus yang sudah langsung mengakomodasi kasus-kasus tertentu, seperti :

  • Stream.max
  • Stream.min
  • IntStream.average
  • dll

Tapi kita fokus ke Stream.reduce ini saja.

Karena fungsi-fungsi diatas sebenarnya juga bisa kita buat dengan menggunakan fungsi Stream.reduce diatas.


Fungsi Stream.reduce ?

Coba kita buat kembali logic code di bagian awal artikel ini dengan cara fungsional :

 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,92,55,77,78);
 8
 9      Integer minValue = nilaiMahasiswa
10			             .stream()
11			             .reduce((a, b) -> a > b ? b : a)
12			             .get();
13      System.out.println(minValue);
14	}
15}

Hasilnya :

55

Apa yang kita lakukan ?

  • baris 10 ==> mengubah Collection kita menjadi Stream yang akan lebih mudah digunakan untuk memakai cara fungsional.
  • baris 11 ==> menerapkan fungsi reduce dengan isi code berupa tertier operator –> (a, b) -> a > b ? b : a code ini artinya : melakukan perbandingan antara a dan b, dan mengembalikan mana yang lebih kecil nilainya.
  • baris 12 ==> mengembalikan nilai hasil proses reductionnya tersebut.

Kita lanjut ke part 2