JavaRush /Java Blog /Random-ID /Antarmuka fungsional Java
Алексей
Level 32

Antarmuka fungsional Java

Dipublikasikan di grup Random-ID
Antarmuka fungsional di Java adalah antarmuka yang hanya berisi 1 metode abstrak. Tujuan utamanya adalah menggunakannya dalam ekspresi lambda dan referensi metode.
Antarmuka fungsional Java - 1
Kehadiran 1 metode abstrak adalah satu-satunya syarat, sehingga antarmuka fungsional juga dapat berisi defaultmetode 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. 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
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!
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION