Java - Antar Muka Fungsional

Halo, pengembang Java masa depan! Hari ini, kita akan melakukan perjalanan yang menyegarkan ke dunia Antar Muka Fungsional di Java. Jangan khawatir jika kamu masih baru di bidang pemrograman; saya akan memandu kamu melalui konsep ini langkah demi langkah, sama seperti yang saya lakukan untuk banyak siswa selama tahun-tahun mengajar saya. Jadi, ambil secangkir kopi (atau minuman kesukaan kamu), dan mari kita melompat!

Java - Functional Interfaces

Apa itu Antar Muka Fungsional?

Bayangkan jika kamu di tempat pertemuan, dan kamu ditugaskan sebagai DJ. Pekerjaan kamu sederhana: memutar musik. Kamu tidak perlu khawatir tentang menyajikan makanan atau mendekorasi tempat pertemuan. Di Java, Antar Muka Fungsional seperti DJ tersebut - memiliki satu pekerjaan spesifik untuk dilakukan, dan melakukan itu dengan baik.

Dalam istilah teknis, Antar Muka Fungsional adalah antar muka yang berisi tepat satu metode abstrak. itu dapat memiliki metode lainnya, tetapi mereka harus adalah metode default atau statis. Metode abstrak tunggal adalah yang memberikan karakter "fungsional" kepada Antar Muka Fungsional.

Contoh 1: Antar Muka Fungsional Sederhana

@FunctionalInterface
interface Selamat {
void greet(String nama);
}

Dalam contoh ini, Selamat adalah Antar Muka Fungsional. Itu hanya memiliki satu metode abstrak greet, yang mengambil parameter String dan tidak mengembalikan apa pun (void).

Anotasi @FunctionalInterface

Mungkin kamu telah melihat anotasi @FunctionalInterface di contoh kita. Ini seperti menempelkan lencana "DJ" pada antar muka kita. Itu memberitahu Java, "Hai, antar muka ini dimaksudkan untuk menjadi fungsional!" Jika kita secara kesalahan menambahkan metode abstrak lainnya, Java akan memberikan kesalahan, membantu kita menjaga sifat fungsional dari antar muka kita.

Menggunakan Antar Muka Fungsional

Sekarang bahwa kita tahu apa itu Antar Muka Fungsional, mari kita lihat bagaimana kita dapat menggunakannya. Salah satu hal yang paling keren tentang Antar Muka Fungsional adalah bahwa kita dapat menggunakannya dengan ekspresi lambda, yang seperti cara singkat untuk menulis metode.

Contoh 2: Menggunakan Antar Muka Fungsional dengan Ekspresi Lambda

public class TesSelamat {
public static void main(String[] args) {
Selamat ramahSelamat = (nama) -> System.out.println("Halo, " + nama + "! Apa kabar?");
ramahSelamat.greet("Alice");

Selamat formalSelamat = (nama) -> System.out.println("Hari baik, " + nama + ". Saya harap kamu baik-baik saja.");
formalSelamat.greet("Bapak Smith");
}
}

Dalam contoh ini, kita membuat dua selamat berbeda menggunakan antar muka Selamat kita. Ekspresi lambda (nama) -> ... mengimplementasikan metode greet secara langsung. Itu seperti menyewa dua DJ berbeda untuk dua pertemuan berbeda!

Ketika kamu menjalankan kode ini, kamu akan melihat:

Halo, Alice! Apa kabar?
Hari baik, Bapak Smith. Saya harap kamu baik-baik saja.

jenis Antar Muka Fungsional di Java

Java menyediakan beberapa Antar Muka Fungsional bawaan untuk membuat hidup kita lebih mudah. Mari kita lihat beberapa yang paling sering digunakan:

1. Predicate

Antar Muka Predicate<T> digunakan untuk fungsi nilai boolean dari satu argumen. Itu seperti pertanyaan yang dapat dijawab dengan ya atau tidak.

import java.util.function.Predicate;

public class ContohPredicate {
public static void main(String[] args) {
Predicate<Integer> adalahDewasa = umur -> umur >= 18;

System.out.println("Apakah 20 adalah umur dewasa? " + adalahDewasa.test(20));
System.out.println("Apakah 15 adalah umur dewasa? " + adalahDewasa.test(15));
}
}

Ini akan menghasilkan:

Apakah 20 adalah umur dewasa? true
Apakah 15 adalah umur dewasa? false

2. Function<T,R>

Antar Muka Function<T,R> mewakili fungsi yang menerima satu argumen dan menghasilkan hasil. Itu seperti mesin yang mengambil sesuatu dan memberikan sesuatu yang lain.

import java.util.function.Function;

public class ContohFunction {
public static void main(String[] args) {
Function<String, Integer> panjangString = str -> str.length();

System.out.println("Panjang 'Halo': " + panjangString.apply("Halo"));
System.out.println("Panjang 'Java adalah keren': " + panjangString.apply("Java adalah keren"));
}
}

Ini akan menghasilkan:

Panjang 'Halo': 5
Panjang 'Java adalah keren': 16

3. Consumer

Antar Muka Consumer<T> mewakili operasi yang menerima satu argumen masukan dan tidak menghasilkan hasil. Itu seperti lubang hitam yang konsumsi data tetapi tidak menghasilkan apapun.

import java.util.function.Consumer;

public class ContohConsumer {
public static void main(String[] args) {
Consumer<String> pencetak = pesan -> System.out.println("Mencetak: " + pesan);

pencetak.accept("Halo, Antar Muka Fungsional!");
pencetak.accept("Java adalah menyenangkan!");
}
}

Ini akan menghasilkan:

Mencetak: Halo, Antar Muka Fungsional!
Mencetak: Java adalah menyenangkan!

4. Supplier

Antar Muka Supplier<T> mewakili pemasok hasil. Itu tidak mengambil argumen tetapi menghasilkan nilai. Itu seperti mesin penjual yang memberikan kamu sesuatu tanpa kamu menempatkan apapun di dalamnya.

import java.util.function.Supplier;
import java.util.Random;

public class ContohSupplier {
public static void main(String[] args) {
Supplier<Integer> pemasokAngkaAcak = () -> new Random().nextInt(100);

System.out.println("Angka acak: " + pemasokAngkaAcak.get());
System.out.println("Angka acak lainnya: " + pemasokAngkaAcak.get());
}
}

Ini akan menghasilkan dua angka acak antara 0 dan 99, misalnya:

Angka acak: 42
Angka acak lainnya: 73

Antar Muka Fungsional yang Ada Sebelum Java 8

Sebelum Java 8 memperkenalkan konsep Antar Muka Fungsional, Java memiliki beberapa antar muka yang sesuai dengan definisi. Ini utamanya digunakan dalam penanganan peristiwa dan pemrograman konkur. Mari kita lihat beberapa contoh:

1. Runnable

Antar Muka Runnable telah ada sejak awal tahun Java. Ini biasanya digunakan untuk membuat thread.

public class ContohRunnable {
public static void main(String[] args) {
Runnable haloRunnable = () -> System.out.println("Halo dari sebuah thread!");
new Thread(haloRunnable).start();
}
}

Ini akan menghasilkan:

Halo dari sebuah thread!

2. Comparator

Antar Muka Comparator digunakan untuk menentukan urutan khusus bagi objek.

import java.util.Arrays;
import java.util.Comparator;

public class ContohComparator {
public static void main(String[] args) {
String[] names = {"Alice", "Bob", "Charlie", "David"};

Comparator<String> komparatorPanjang = (s1, s2) -> s1.length() - s2.length();

Arrays.sort(names, komparatorPanjang);

System.out.println("Diurutkan berdasarkan panjang: " + Arrays.toString(names));
}
}

Ini akan menghasilkan:

Diurutkan berdasarkan panjang: [Bob, Alice, David, Charlie]

Kesimpulan

Selamat! Kamu baru saja mengambil langkah pertamamu ke dunia Antar Muka Fungsional di Java. Kita telah membahas apa itu, bagaimana menggunakannya, dan melihat beberapa jenis umum. Ingat, Antar Muka Fungsional adalah seperti alat khusus di rak peralatanmu di Java. Mereka membantu kamu menulis kode yang lebih bersih dan ekspresif.

Sebagai kamu melanjutkan perjalananmu di Java, kamu akan menemukan lebih banyak penggunaan untuk Antar Muka Fungsional. Mereka sangat kuat saat bekerja dengan stream dan koleksi, yang akan kita cobakan dalam pelajaran mendatang.

Terus latihan, tetap curious, dan yang paling penting, nikmati pemrograman! Java adalah sebuah bahasa yang luas dan menarik, dan kamu sudah di jalan yang baik menuju menguasainya. Sampai jumpa lagi, selamat coding!

Credits: Image by storyset