Antarmuka fungsional di Java adalah antarmuka yang hanya berisi 1 metode abstrak. Tujuan utamanya adalah menggunakannya dalam ekspresi lambda dan referensi metode.
Kehadiran 1 metode abstrak adalah satu-satunya syarat, sehingga antarmuka fungsional juga dapat berisi
Saya tidak akan membahasnya secara detail. Saya perhatikan bahwa yang paling sering digunakan adalah: Consumer<T> , Function<T,R> , Predicate<T> , Supplier<T> , UnaryOperator<T> dan bentuk Binya . Detail lebih lanjut dapat ditemukan di halaman dokumentasi: Paket java.util.function
default
metode static
. Anda dapat menambahkan anotasi @FunctionalInterface ke antarmuka fungsional. Ini tidak diperlukan, tetapi jika anotasi ini ada, kode tidak akan dikompilasi jika terdapat lebih atau kurang dari 1 metode abstrak. Disarankan untuk menambahkan @FunctionalInterface. Ini akan memungkinkan Anda untuk menggunakan antarmuka dalam ekspresi lambda tanpa khawatir seseorang akan menambahkan metode abstrak baru ke antarmuka dan metode tersebut tidak lagi berfungsi. Java memiliki antarmuka fungsional bawaan yang bertempat di file java.util.function
.
Apa lagi yang harus dibaca: |
---|
import java.util.function.Predicate;
//Определяем свой функциональный интерфейс
@FunctionalInterface
interface MyPredicate {
boolean test(Integer value);
}
public class Tester {
public static void main(String[] args) throws Exception {
MyPredicate myPredicate = x -> x > 0;
System.out.println(myPredicate.test(10)); //true
//Аналогично, но используется встроенный функциональный интерфейс java.util.function.Predicate
Predicate<Integer> predicate = x -> x > 0;
System.out.println(predicate.test(-10)); //false
}
}
Namun ternyata ada satu hal halus yang dijelaskan dalam Spesifikasi Bahasa Java: “antarmuka tidak mewarisi dari Object, melainkan secara implisit mendeklarasikan banyak metode yang sama dengan Object.” Ini berarti bahwa antarmuka fungsional juga dapat berisi metode abstrak yang didefinisikan dalam kelas Object
. Kode di bawah ini valid, tidak akan ada kesalahan kompilasi atau runtime:
@FunctionalInterface
public interface Comparator<T> {
int compare(T o1, T o2);
boolean equals(Object obj);
// другие default or static методы
}
Berhati-hatilah saat wawancara! Semoga beruntung!
GO TO FULL VERSION