JavaRush /Java блогы /Random-KK /Java функционалды интерфейстері
Алексей
Деңгей

Java функционалды интерфейстері

Топта жарияланған
Java тіліндегі функционалды интерфейс – бұл тек 1 дерексіз әдісті қамтитын интерфейс. Негізгі мақсат - оны лямбда өрнектерінде және әдіс сілтемелерінде пайдалану.
Java функционалды интерфейстері – 1
1 дерексіз әдістің болуы жалғыз шарт болып табылады, сондықтан функционалды интерфейсте defaultәдістер де болуы мүмкін static. Функционалдық интерфейске @FunctionalInterface annotationсын қосуға болады. Бұл талап етілмейді, бірақ бұл annotation бар болса, 1 дерексіз әдіс көп немесе аз болса, code құрастырылмайды. @FunctionalInterface қосу ұсынылады. Бұл интерфейсті біреу интерфейске жаңа дерексіз әдіс қосады және ол функционалды болуын тоқтатады деп алаңдамай лямбда өрнектерінде интерфейсті пайдалануға мүмкіндік береді. Java ішінде орнатылған функционалды интерфейстері бар java.util.function. Мен оларға егжей-тегжейлі тоқталмаймын. Ең жиі қолданылатындар: Consumer<T> , Function<T,R> , Predicate<T> , Supplier<T> , UnaryOperator<T> және олардың Bi пішіндері. Қосымша мәліметтерді құжаттама бетінен табуға болады: 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
    }
}
Бірақ Java тілінің спецификациясында сипатталған бір нәзік нүкте бар екен: «интерфейстер Объекттен мұра емес, бірақ Объект сияқты көптеген әдістерді жасырын түрде жариялайды». Бұл функционалдық интерфейстер сыныпта анықталған дерексіз әдістерді қамтуы мүмкін дегенді білдіреді Object. Төмендегі code жарамды, компиляция немесе орындалу қателері болмайды:
@FunctionalInterface
public interface Comparator<T> {
   int compare(T o1, T o2);
   boolean equals(Object obj);
   // другие default or static методы
}
Сұхбат кезінде абай болыңыз! Іске сәт!
Пікірлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION