Interfejs funkcjonalny w Javie to interfejs zawierający tylko jedną metodę abstrakcyjną. Głównym celem jest użycie go w wyrażeniach lambda i odwołaniach do metod.
Jedynym warunkiem jest obecność 1 metody abstrakcyjnej, zatem interfejs funkcjonalny może zawierać także
Nie będę się nad nimi szczegółowo rozwodzić. Zaznaczam, że najczęściej używane to: Consumer<T> , Function<T,R> , Predicate<T> , Dostawca<T> , UnaryOperator<T> i ich formy Bi . Więcej szczegółów można znaleźć na stronie dokumentacji: Pakiet java.util.function
default
metody static
. Możesz dodać adnotację @FunctionalInterface do interfejsu funkcjonalnego. Nie jest to wymagane, ale jeśli ta adnotacja jest obecna, kod nie zostanie skompilowany, jeśli istnieje więcej lub mniej niż 1 metoda abstrakcyjna. Zalecane jest dodanie @FunctionalInterface. Dzięki temu będziesz mógł używać interfejsu w wyrażeniach lambda bez obawy, że ktoś doda do interfejsu nową metodę abstrakcyjną i przestanie ona działać. Java ma wbudowane interfejsy funkcjonalne umieszczone w pliku java.util.function
.
Co jeszcze warto przeczytać: |
---|
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
}
}
Okazuje się jednak, że istnieje jeden subtelny punkt opisany w specyfikacji języka Java: „interfejsy nie dziedziczą po obiekcie, ale raczej w sposób dorozumiany deklarują wiele takich samych metod jak obiekt”. Oznacza to, że interfejsy funkcjonalne mogą dodatkowo zawierać metody abstrakcyjne zdefiniowane w klasie Object
. Poniższy kod jest prawidłowy, nie będzie żadnych błędów kompilacji ani błędów wykonania:
@FunctionalInterface
public interface Comparator<T> {
int compare(T o1, T o2);
boolean equals(Object obj);
// другие default Lub static методы
}
Zachowaj ostrożność podczas rozmowy kwalifikacyjnej! Powodzenia!
GO TO FULL VERSION