Pelajaran modul (1/2)
Ekspresi Lambda
Mulai dari Java 8, pemrograman fungsional didukung melalui Ekspresi Lambda. Ekspresi lambda pada dasarnya adalah metode anonim (fungsi tanpa nama) yang dapat diteruskan sebagai argumen ke metode atau disimpan dalam variabel.
Antarmuka Fungsional
Ekspresi lambda hanya dapat digunakan jika Antarmuka Fungsional diperlukan. Antarmuka fungsional adalah antarmuka yang mendeklarasikan ** tepat satu metode abstrak **. Java menandai antarmuka ini dengan anotasi @FunctionalInterface opsional.
Contoh antarmuka fungsional yang ditentukan pengguna:
@FunctionalInterface
interface MathOperation {
int operate(int a, int b);
}Sebelum Java 8, Anda harus mendefinisikan kelas dalam anonim. Dengan lambdas, sintaksnya disederhanakan menjadi:
MathOperation addition = (a, b) -> a + b;
int result = addition.operate(5, 3); // Returns 8Struktur Ekspresi Lambda
Sintaks dasar lambda adalah:
(parameters) -> { body }
- Tanpa parameter:
() -> System.out.println("Hello") - Parameter tunggal:
x -> x * 2(tanda kurung dapat dihilangkan) - Beberapa parameter:
(x, y) -> x + y - Badan multi-baris: jika isi berisi beberapa pernyataan, diperlukan kurung kurawal
{}dan pernyataanreturnyang eksplisit.
MathOperation detailedAddition = (a, b) -> {
System.out.println("Adding...");
return a + b;
};Antarmuka Fungsional Standar di Java
Paket java.util.function menyediakan beberapa antarmuka fungsional bawaan:
Predicate<T>: menerima argumen bertipeTdan mengembalikan boolean (metodetest(T t)).Consumer<T>: menerima argumen bertipeTdan melakukan operasi tanpa mengembalikan hasil (metodeaccept(T t)).Function<T, R>: menerima argumenTdan mengembalikan hasilR(metodeapply(T t)).Supplier<T>: tidak menerima argumen dan mengembalikan nilai bertipeT(metodeget()).
Cobalah sendiri
Lengkapi kode dengan membuat instance antarmuka Kalkulator menggunakan ekspresi lambda yang menambahkan dua bilangan bulat. Kemudian, aktifkan metode penghitungan yang melewati 5 dan 3, dan cetak hasilnya.
Tunjukkan petunjuk
Deklarasikan `Calculator adder = (a, b) -> a + b;` lalu aktifkan `adder.calculate(5, 3)` di dalam panggilan cetak.
Solusi tersedia setelah 3 upaya
Buat instance antarmuka fungsional standar Predicate<String> bernama isLong menggunakan ekspresi lambda yang memeriksa apakah panjang string lebih besar dari 5 karakter. Kemudian cetak hasil tes 'hello world'.
Tunjukkan petunjuk
Lambda untuk `Predicate<String>` mengambil parameter `s` dan mengembalikan `s.length() > 5` sebagai kondisi boolean.
Solusi tersedia setelah 3 upaya
Urutkan daftar nama string berdasarkan abjad dengan memanggil metode sort() di dalamnya dan meneruskan ekspresi lambda yang mengimplementasikan Comparator (mengambil dua string s1, s2 dan membandingkannya menggunakan bandingkanTo).
Tunjukkan petunjuk
Gunakan `names.sort((s1, s2) -> s1.compareTo(s2));` untuk mengurutkan daftar pada tempatnya.
Solusi tersedia setelah 3 upaya