Java Lambda Expression - Part 2
Pendahuluan
Pendahuluan mengenai Lambda Expression bisa dilihat di sini, Lambda Expression di Java di sini
Fitur Lambda Expression diperkenalkan di Java 8, yang memperkenalkan konsep-konsep fungsional programming di dalam bahasa pemrograman berbasis objek.
Konsep Functional Interface ini pulalah yang menjembatani antara OOP nya Java dengan konsep Lambda Expression nya Java.
Functional Interface
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.
Dari dulu Java memiliki contoh Functional Interface ini, misalnya interface Runnable.
Contoh :
package com.example.demo.lambda;
public class FuncInterface {
public static void main(String args[]) {
Runnable r1 = new Runnable() {
@Override
public void run() {
System.out.println("Thread lagi jalan...");
}
};
r1.run();
}
}
Sebuah program sederhana yang menjalankan sebuah implementasi dari interface Runnable, yang hanya punya satu method yaitu run() saja.
Dan biasanya kita menggunakan class Runnable ini untuk tujuan manipulasi threading dengan mengassign class implementasi Runnable ini ke dalam sebuah Thread, sbb :
package com.example.demo.lambda;
public class FuncInterface {
public static void main(String args[]) {
Runnable r1 = new Runnable() {
@Override
public void run() {
System.out.println("Thread lagi jalan...");
}
};
Thread t1 = new Thread(r1);
t1.start();
}
}
dan code diatas berjalan dengan lancarnya.
Lambda expression
Coba kita lihat sekarang kalau memakai pendekatan Fungsional
Dengan Functional di Java, maka kita bisa melakukan implementasi dari interface Runnable diatas, tanpa perlu mengassign anynomous inner class diatas ke sebuah variable r1 seperti diatas.
Kembali lagi dengan konsep menggunakan Lambda Expression, maka kita bisa membuat sebuah fungsi tanpa adanya penamaan atau peng-assign-an sebuah variable ke fungsi tersebut.
Contoh :
package com.example.demo.lambda;
public class FuncInterface3 {
public static void main(String args[]) {
Thread t1 = new Thread(()->System.out.println("thread is running..."));
t1.start();
}
}
Disini kita lihat bahwa kita mempunyai :
- sebuah parameter kosong (), yang dijadikan parameter sebelum code System.out.println(“thread is running…").
- sebuah tanpa panah -> .
- sebuah fungsi tanpa nama, hanya berisi code nya saja., yaitu System.out.println(“thread is running…").
Konstruksi dari hal-hal diatas, yaitu formal parameter, tanda panah, dan fungsi tanpa nama membentuk apa yang kita namakan Lambda Expression.
Inilah yang kemudian sering kita temui di code-code fungsional di Java.
Keuntungannya
Apa sih keuntungannya memakai cara seperti diatas ?
Kalau kita lihat, secara kasat mata, maka :
- Codenya lebih singkat, tanpa membutuhkan melihat code interface nya, tetapi langsung kepada implementasinya.
- Lebih berfikir abstraksi dibandingkan prosedural. Hal ini karena di waktu melakukan code, pikiran kita sudah menyimpan code interface Runnable tadi, dan tidak perlu melakukan instansiasi secara jelas.
- Bisa dikombinasikan dengan konsep fungsional lainnya dalam bentuk fluent interface, misalnya untuk kasus pengolahan data streaming, tanpa membutuhkan code atau class yang banyak.
- dll.
Kekurangannya
Kalau ada keuntungan, maka tentu saja ada kekurangannya.
Misalnya :
- Lambda Expression hanya bisa dilakukan untuk interface bertipe Functional Interface atau sering disebut Single Abstract Method Hal ini tentunya tidak terlepas dari konsep Lambda Expression yang sudah kita bahas di sini
- Mengganti paradigma OOP ke Fungsional yang mungkin butuh penyesuaian untuk beberapa kasus.
- Konstrukti fungsi tanpa nama yang tidak bisa digunakan berulang kali untuk keperluan code lain. Hal ini nanti akan menggiring kita ke konsep Closure, Functor, dan Monads
- dll.
Lanjut ke part selanjutnya