Функціональний інтерфейс Java - це інтерфейс, який містить лише 1 абстрактний метод. Основне призначення – використання в лямбдах виразах і method reference.
Наявність 1 абстрактного методу - це єдина умова, у такий спосіб функціональний інтерфейс може містити також
Не зупинятимуся на них докладно. Зазначу, що найчастіше використовуються: Consumer<T> , Function<T,R> , Predicate<T> , Supplier<T> , UnaryOperator<T> та їх Bi – форми. Докладніше можна переглянути на сторінці документації: Package java.util.function
default
і static
методи. До функціонального інтерфейсу можна додати інструкцію @FunctionalInterface. Це не обов'язково, але за наявності цієї інструкції код не скомпілюється, якщо буде більше або менше, ніж 1 абстрактний метод. Рекомендується додавати @FunctionalInterface. Це дозволить використовувати інтерфейс у лямбда виразах, не остерігаючись того, що хтось додасть до інтерфейсу нового абстрактного методу і він перестане бути функціональним. Java має вбудовані функціональні інтерфейси, розміщені в пакеті 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 методы
}
Будьте уважні на співбесіді! Успіхів!
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ