JavaRush /Java блог /Random UA /Java functional interfaces
Алексей
32 рівень

Java functional interfaces

Стаття з групи Random UA
Функціональний інтерфейс Java - це інтерфейс, який містить лише 1 абстрактний метод. Основне призначення – використання в лямбдах виразах і method reference.
Java functional interfaces - 1
Наявність 1 абстрактного методу - це єдина умова, у такий спосіб функціональний інтерфейс може містити також defaultі staticметоди. До функціонального інтерфейсу можна додати інструкцію @FunctionalInterface. Це не обов'язково, але за наявності цієї інструкції код не скомпілюється, якщо буде більше або менше, ніж 1 абстрактний метод. Рекомендується додавати @FunctionalInterface. Це дозволить використовувати інтерфейс у лямбда виразах, не остерігаючись того, що хтось додасть до інтерфейсу нового абстрактного методу і він перестане бути функціональним. Java має вбудовані функціональні інтерфейси, розміщені в пакеті java.util.function. Не зупинятимуся на них докладно. Зазначу, що найчастіше використовуються: Consumer<T> , Function<T,R> , Predicate<T> , Supplier<T> , UnaryOperator<T> та їх Bi – форми. Докладніше можна переглянути на сторінці документації: Package 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 Language Specification: “interfaces do not inherit from Object, but rather implicitly declare many of the same methods as Object.” Це означає, що функціональні інтерфейси можуть додатково містити абстрактні методи, визначені в класі Object. Код нижче валідний, помилок компіляції та часу виконання не буде:
@FunctionalInterface
public interface Comparator<T> {
   int compare(T o1, T o2);
   boolean equals(Object obj);
   // другие default або static методы
}
Будьте уважні на співбесіді! Успіхів!
Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ