JavaRush /Blog Java /Random-PL /Interfejsy funkcjonalne Java
Алексей
Poziom 32

Interfejsy funkcjonalne Java

Opublikowano w grupie Random-PL
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.
Interfejsy funkcjonalne Java - 1
Jedynym warunkiem jest obecność 1 metody abstrakcyjnej, zatem interfejs funkcjonalny może zawierać także defaultmetody 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. 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
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!
Komentarze
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION