Java-da funksional interfeys yalnız 1 mücərrəd metoddan ibarət interfeysdir. Əsas məqsəd onu lambda ifadələrində və metod istinadlarında istifadə etməkdir.
1 mücərrəd metodun olması yeganə şərtdir, ona görə də funksional interfeysdə
Onların üzərində ətraflı dayanmayacağam. Qeyd edim ki, ən çox istifadə olunanlar bunlardır: Consumer<T> , Function<T,R> , Predicate<T> , Supplier<T> , UnaryOperator<T> və onların Bi formaları. Ətraflı məlumatı sənədlər səhifəsində tapa bilərsiniz: Paket java.util.function
default
metodlar da ola bilər static
. Funksional interfeysə @FunctionalInterface annotasiyasını əlavə edə bilərsiniz. Bu tələb olunmur, lakin bu annotasiya varsa, 1 abstrakt metoddan çox və ya az olduqda kod tərtib edilməyəcək. @FunctionalInterface əlavə etmək tövsiyə olunur. Bu, kiminsə interfeysə yeni mücərrəd metod əlavə edəcəyindən və onun funksionallığını dayandıracağından narahat olmadan lambda ifadələrində interfeysdən istifadə etməyə imkan verəcək. Java-da quraşdırılmış funksional interfeyslərə malikdir java.util.function
.
Başqa nə oxumaq lazımdır: |
---|
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
}
}
Lakin belə çıxır ki, Java Dilinin Spesifikasiyasında təsvir olunan bir incə məqam var: “interfeyslər Obyektdən miras qalmır, əksinə Obyektlə eyni metodların çoxunu dolayısı ilə bəyan edirlər”. Bu o deməkdir ki, funksional interfeyslər əlavə olaraq sinifdə müəyyən edilmiş abstrakt metodları ehtiva edə bilər Object
. Aşağıdakı kod etibarlıdır, kompilyasiya və ya icra zamanı xətaları olmayacaq:
@FunctionalInterface
public interface Comparator<T> {
int compare(T o1, T o2);
boolean equals(Object obj);
// другие default or static методы
}
Müsahibə zamanı diqqətli olun! Uğurlar!
GO TO FULL VERSION