Lambda adalah fitur Java 8 yang paling ditunggu-tunggu. Setelah batal diimplementasikan di Java 7, akhirnya fitur ini akan hadir di Java 8. Bagi anda yang familiar dengan bahasa pemrograman seperti Ruby, Scala, Groovy tentunya fitur ini bukanlah hal yang baru (dengan nama yang berbeda seperti block, closure, function). Dengan lambda sebuah fungsi dapat diperlakukan sebagai objek yang berdiri sendiri sehingga bisa di-assign ke sebuah variabel, di-return dari sebuah method atau di-passing sebagai parameter ke fungsi yang lain. Istilah kerennya first-class function.
Di saat tulisan ini ditulis Java 8 masih ada di tahap early access dan direncanakan akan dirilis 18 Maret 2014. Oracle merilis dua versi early access JDK: dengan lambda dan tanpa lambda. Download versi terakhir Java 8 dengan dukungan lambda di sini.
Penggunaan lambda sangat berkaitan dengan functional interface, yaitu interface yang hanya mempunyai satu method seperti Comparator, Runnable atau ActionListener. Functional interface ini digunakan untuk menerapkan konsep functional programming di Java. Sebenarnya programmer Java sudah tidak asing dengan interface jenis ini, hanya saja di Java 8 functional interface lebih ditegaskan lagi. Functional Interface akan saya bahas di posting selanjutnya.
Untuk kesempatan kali ini kita akan lihat bagaimana implementasi Comparator di Java 8 menggunakan lambda. Tapi sebelumnya kita harus punya sesuatu untuk dibandingkan. Untuk itu kita punya class Person dengan definisi seperti di bawah ini:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public class Person
{
private String firstName;
private String lastName;
public Person(String firstName, String lastName)
{
this.firstName = firstName;
this.lastName = lastName;
}
public String getFirstName()
{
return this.firstName;
}
public String getLastName()
{
return this.lastName;
}
public String getFullName()
{
return this.firstName + " " + this.lastName;
}
}
Misalkan kita ingin mengurutkan objek-objek yang ada di dalam sebuah List berdasarkan nama belakang secara descending. Di Java 7, kita bisa melakukannya seperti berikut:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
List<Person> persons = Arrays.asList(
new Person("Bustanil", "Arifin"),
new Person("Hesty", "Ernawati"),
new Person("Joko", "Widodo")
);
Comparator<Person> sortByLastNameDesc = new Comparator<Person>()
{
public int compare(Person p1, Person p2)
{
return p2.getLastName().compareTo(p1.getLastName());
}
}
Collections.sort(persons, sortByLastNameDesc);
Di Java 8, kita bisa sederhanakan definisi Comparator di atas dengan menggunakan lambda:
1
2
3
Comparator<Person> sortByLastNameDesc = (p1, p2) -> p2.getLastName().compareTo(p1.getLastName());
Collections.sort(persons, sortByLastNameDesc);
Atau kita bisa buat menjadi inline seperti berikut:
Dengan menggunakan lambda, kita bisa mengurangi jumlah baris kode secara signifikan dan juga meningkatkan readability karena kita lagi harus baca 5 - 10 baris hanya untuk mengetahui bagaimana functional interfacenya diimplementasikan.
Kapan kita gunakan lambda? Lambda akan sangat bermanfaat saat kita bermaksud untuk membungkus sebuah perilaku yang tidak membutuhkan konstruktor, field dan fungsi tambahan. Bila perilaku yang akan diimplementasikan masih membutuhkan konstruktor, field atau fungsi tambahan maka kita tetap harus menggunakan cara lama misalnya dengan menggunakan anonymous inner class.
Contoh kode bisa diunduh di https://github.com/bustanil/java8-lambda.