Java Lambda Expression - Part 1
Pendahuluan
Pendahuluan mengenai Lambda Expression bisa dilihat di sini
Fitur Lambda Expression diperkenalkan di Java 8.
Release Java 8 inilah yang memperkenalkan konsep-konsep fungsional programming di dalam bahasa pemrograman berbasis objek.
Termasuk didalamnya Lambda Expression.
Penambahan fitur ini menjadi lompatan yang besar bagi bahasa Java yang terkenal sebagai bahasa berorientasi Object dan bukan berorientasi Fungsi.
Sebelumnya, bahasa Java berupaya mengakomodasi konsep “Fungsional” ini dengan berbasiskan “Object”, misalnya dengan :
- Anynomous Classes.
- Functional Interface, yaitu interface yang hanya punya satu method, seperti yang kita lihat di interface Runnable atau Comparator.
- Strategy pattern.
- Callback pattern.
- dll
Walaupun tidak sepenuhnya mengakomodasi konsep “pure” dari Functional Programming, akan tetapi konsep-konsep diatas mencoba “meniru” cara berfikir Fungsional di dalam bahasa yang berorientasi Objek.
Anynomous Classes
Kalau kita membahas mengenai Lambda Expression di Java, maka kita pertama kali akan teringat dengan cara awal dari Java untuk mencapai hal yang sama.
Yaitu memakai Anynomous Class
Contoh :
// class interface
package com.example.demo.lambda;
import java.math.BigDecimal;
public interface Kendaraan {
String deskripsi();
void setHargaJual(BigDecimal harga);
BigDecimal getHargaJual();
}
// code implementasi nya
import java.math.BigDecimal;
public class Program1 {
public static void main(String[] args) {
Kendaraan mobil = new Kendaraan() {
BigDecimal hargaJual = new BigDecimal("100000000");
@Override
public String deskripsi() {
return "Mobil adalah sebuah Kendaraan";
}
@Override
public void setHargaJual(BigDecimal harga) {
this.hargaJual = harga;
}
@Override
public BigDecimal getHargaJual() {
return this.hargaJual;
}
};
System.out.println(mobil.deskripsi());
System.out.println(mobil.getHargaJual());
}
}
Disini kita lihat bahwa kita mempunyai :
- sebuah Interface bernama Kendaraan.
- sebuah Anynomous Class yang mengimplementasikan interface Kendaraan diatas.
Kita tidak membuat sebuah file Class baru khusus untuk class Mobil diatas.
Akan tetapi kita cuma meng-assignnya ke sebuah variable mobil yang bertipe Kendaraan.
Hal yang berbeda dengan yang biasa kita lakukan dengan pendekatan OOP, dan beberapa konsep design pattern yang ada.
Secara “feeling”, kita bisa merasakan ada rasa “Fungsional” dimasukkan ke dalam code diatas,
Functional Interface
Lalu muncullah namanya konsep Functional Interface.
Konsep yang mencoba untuk meng-abstract-kan sebuah fungsi secara umum, dan hanya memakai satu method saja, didalam sebuah kontrak interface.
Hal ini tidak lepas dari konsep Single Object Responsibility (yang kita temui di konsep SOLID).
Dimana kalau kita mau implement sesuatu secara umum, maka kita harus mengikatkan diri ke sebuah interface, yang sebisa mungkin hanya mempunyai satu method saja.
Misalkan :
- Interface Runnable, yang hanya punya satu method public void run();.
- Interface Comparable, yang hanya punya satu method public int compareTo(Object obj);.
Kalau kita lihat :
- Interface Runnable, ini adalah kontrak bagi class yang mengimplementasikannya, bahwa tugasnya adalah agar instance ini bisa run sebagai thread. Dan tidak ada tugas lainnya.
- Interface Comparable, ini adalah kontrak bagi class yang mengimplementasikannya, bahwa instance nya bisa dicompare dengan instance yang lain.
Jadi kalau kita lihat, masing-masing class diatas dibuat dengan tujuan spesifik, dan “memaksa” class yang mengimplementasikannya untuk “cuma” mengimplementasikan satu method saja.
Dengan fokus hanya dengan satu fungsi saja dari sebuah interface, maka secara Object Oriented Programming, maka dapat dicapai :
- Single Object Responsibility. Satu kontrak interface mengerjakan/mendefinisikan satu tugas saja.
- Open Closed Principle, dimana kalau kita butuh class tersebut mempunyai kontrak lain, tinggal nambahin Functional Interface lain dan tambahkan sebagai parent/abstract class nya.
- Interface Segregation, yaitu pemisahan interface secara jelas.
Konsep Functional Interface ini pulalah yang menjembatani antara OOP nya Java dengan konsep Lambda Expression nya Java.
Functional Interface ini sering disebut juga sebagai Single Abstract Method (SAM) interface.
Hal ini karena hanya mempunyai satu method saja yang mesti diimplementasikan oleh implementornya.
Kita lanjut ke part selanjutnya