Pendahuluan

Pendahuluan mengenai Lambda Expression bisa dilihat di sini, Lambda Expression di Java di sini, Pendahuluan mengenai Fungsional Interface di sini

Fitur Lambda Expression diperkenalkan di Java 8, yang memperkenalkan konsep-konsep fungsional programming di dalam bahasa pemrograman berbasis objek.

Konsep Functional Interface di Java lah yang menjembatani antara OOP nya Java dengan konsep Lambda Expression nya Java.


Functional Interface

Kembali ke contoh sebelumnya :

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.

Dan Lambda Expression hanya bisa dilakukan untuk interface bertipe 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.

Di Java, ide Fungsional Interface ini membuat pengembang Java ingin mengakomodasi semua kondisi abstrak dari kasus-kasus yang “mungkin” ada.

Misalnya :

  • Untuk mengikatkan kode untuk kasus true/false, maka dibikinlah FunctionalInterface bernama Predicate, yang didalamnya cuma ada satu abstract method test(T t). Sehingga kita bisa dengan mudah membuat Lambda Expression dengan misalnya x -> x.equals(“variableTest”);.

  • Untuk mengikatkan kode untuk kasus satu parameter dan mengeluarkan hasil dari fungsi tersebut, maka dibikinlah FunctionalInterface bernama Function, yang didalamnya ada abstract method apply(T t). Sehingga kita bisa dengan mudah membuat Lambda Expression dengan misalnya x -> x+1;

Tentu saja tujuannya biar bisa diimplementasikan dengan menggunakan Lambda Expression yaitu tanpa perlu mengassign sebuah variable ke implementasinya.

Sehingga kita tidak perlu sebenarnya memanggil :

  • fungsi Predicate.test(T t);
  • fungsi Predicate.apply(T t);

ketika “benar-benar” ingin memakai “pure” Lambda Expression untuk penggunaannya.

Karena konstruksi dari sebuah Lambda Expression memang untuk menampilkan secara lugas isi dari code nya tanpa instansiasi sebuah object atau variable.

Contoh :


			List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8);
      List<Integer> collect = list.stream().filter(x -> x > 3).collect(Collectors.toList());
			System.out.println(collect);

			// hasilnya
			[4, 5, 6, 7, 8]

Secara otomatis, JRE dari Java akan memilih Functional Interface yang didefinisikan oleh fungsi filter diatas, yaitu Fungsional Interface Predicate.

Tetapi tentu saja bisa saja kita membuat variable untuk Predicate yang ada.

Biasanya untuk kejelasan code dan modularasi code.

Misalnya :

			List<Integer> list2 = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8);
			Predicate<Integer> predicate2 = x -> x > 3;

			List<Integer> collect2 = list2.stream().filter(x -> predicate2.test(x)).collect(Collectors.toList());
			System.out.println(collect2);

			// hasilnya
			[4, 5, 6, 7, 8]

Built-In Fungsional Interface

Dengan persyaratan hanya satu abstract method yang perlu diimplementasi di sebuah Functional Interface, maka tentunya akan banyak “Kondisi” yang mesti dibuat.

Beruntungnya, hampir setiap Lambda Expression tidak perlu lagi kita definisikan Functional Interface seperti apa yang diperlukan untuk dibuatkan kontrak interfacenya.

Semuanya sudah disediakan oleh JDK Java.

Kita menyebutnya Built-in Functional Interfaces

Apakah bentuk Functional Interface nya :

  • menerima satu argumen fungsi dan menghasilkan boolean.
  • menerima dua argumen fungsi dan menghasilkan boolean.
  • menerima satu argumen fungsi dan menghasilkan object lain.
  • menerima dua argumen fungsi dan menghasilkan object lain.
  • dll

Sehingga kita dengan mudah memilih Functional Interface yang mana saja yang cocok bagi kebutuhan code kita.

Lanjut ke Built-In Functional Interface di Java