02 Juni 2018
Mengenal Lambda Expression

Lambda Expression atau yang biasa dikenal dalam bahasa pemrograman lain sebagai fungsi anonim (anonymous function) adalah fungsi yang didefinisikan tanpa menggunakan identifier. Lambda Expression mulai diperkenalkan pada Java SE 8 dengan tujuan untuk menyederhanakan penggunaan interface yang hanya memiliki satu metode abstrak.

Java Interface

Sebelum mengenal lebih jauh tentang lambda expression, ada baiknya kita mulai dengan mengingat kembali konsep interface dalam pemrograman java. Perhatikan contoh kode interface berikut ini :

interface PersegiPanjang {
  double hitung(double panjang, double lebar);
}

Kode interface diatas dapat diimplementasikan menjadi class. Sebagai contoh, untuk menghitung luas persegi panjang kita gunakan kode seperti berikut :

class LuasPersegiPanjang implements PersegiPanjang {
  @Override
  public double hitung(double panjang, double lebar) {
    return panjang * lebar;
  }
}

Selanjutnya kita bisa bentuk dan gunakan objek dari class LuasPersegiPanjang :

LuasPersegiPanjang luas = new LuasPersegiPanjang();
System.out.println(luas.hitung(8.5, 5));

Cara lain yang bisa digunakan adalah dengan membentuk class anonim (anonymous class) dari interface PersegiPanjang

PersegiPanjang keliling = new PersegiPanjang() {
  @Override
  public double hitung(double panjang, double lebar) {
    return 2 * (panjang + lebar);
  }
};
System.out.println(keliling.hitung(8.5, 5));

Syntax

Untuk bisa menggunakan lambda expression, interface yang akan diimplementasikan hanya boleh memiliki satu buah metode. Interface jenis ini biasa dikenal dengan nama functional interface.

Interface PersegiPanjang yang sudah dibuat sebelumnya dapat diimplementasikan menggunakan lambda expression seperti berikut :

// luas
PersegiPanjang luas = (p, l) -> p * l;
System.out.println(luas.hitung(8, 5));
// keliling
PersegiPanjang keliling = (p, l) -> 2 * (p + l);
System.out.println(keliling.hitung(8, 5));

Di baris kedua dan kelima dari kode diatas kita langsung menyebutkan implementasi dari metode abstrak hitung() yang disebutkan dalam interface PersegiPanjang. Pada kedua baris tersebut kita gunakan operator arrow (->) dengan sintaks seperti berikut :

(parameter) -> expression

Di sisi kiri operator adalah parameter yang akan digunakan dalam expression, bisa dikosongkan jika tidak dibutuhkan. Sedangkan di sisi kanan operator (expression) adalah aksi yang akan dilakukan, sebagai contoh :

(p, l) -> p * l;

Penjelasan :

  1. Disisi kiri disebutkan dua parameter yaitu panjang (p) dan lebar (l) dari persegi panjang
  2. Disisi kanan disebutkan operasi yang akan dilakukan, dalam hal ini adalah mengalikan nilai parameter p dan l untuk mendapatkan luas

Penggunaan Umum

Berikut diperlihatkan beberapa contoh umum penggunaan lambda expression dalam pemrograman java.

ActionListener

Dalam pemrograman GUI Swing, interface ActionListener digunakan untuk menerima event yang terjadi pada suatu objek seperti user mengklik tombol atau item menu. Interface ini hanya memiliki satu buah metode yaitu actionPerformed(). Contoh implementasinya sebagai berikut :

class ButtonListener implements ActionListener {
  @Override
  public void actionPerformed(ActionEvent e) {
    System.out.println("Hello World");
  }
}

JButton btnSample = new JButton("Sample");
btnSample.addActionListener(new ButtonListener());

Kode diatas bisa disederhanakan dengan lambda expression menjadi seperti berikut :

JButton btnSample = new JButton("Sample");
btnSample.addActionListener((e) -> System.out.println("Hello World"));

Runnable

Interface Runnable digunakan pada class yang objek bentukannya akan dieksekusi pada thread yang berbeda dari program utama. Interface ini hanya memiliki satu metode yaitu run(). Contoh implementasinya adalah sebagai berikut :

class RunnableImpl implements Runnable {
  @Override
  public void run() {
    int delay = 500;
    int x = 0;
    while(true) {
      x++;
      System.out.println("Baris perulangan ke-" + x);
      try {
        Thread.sleep(delay);
      }
      catch(InterruptedException exc) {
        System.err.println(exc.toString());
      }
    }
  }
}

Thread t = new Thread(new RunnableImpl());
t.start();

Kode diatas dapat ditulis dengan lambda expression seperti berikut :

new Thread(() -> {
  int delay = 500;
  int x = 0;
  while(true) {
    x++;
    System.out.println("Baris perulangan ke-" + x);
    try {
      Thread.sleep(delay);
    }
    catch(InterruptedException exc) {
      System.err.println(exc.toString());
    }
  }
}).start();