JavaRush /Java Blog /Random-IT /Interfacce funzionali Java
Алексей
Livello 32

Interfacce funzionali Java

Pubblicato nel gruppo Random-IT
Un'interfaccia funzionale in Java è un'interfaccia che contiene solo 1 metodo astratto. Lo scopo principale è utilizzarlo nelle espressioni lambda e nei riferimenti ai metodi.
Interfacce funzionali Java - 1
La presenza di 1 metodo astratto è l'unica condizione, quindi un'interfaccia funzionale può contenere anche defaultmetodi static. È possibile aggiungere l'annotazione @FunctionalInterface a un'interfaccia funzionale. Ciò non è obbligatorio, ma se questa annotazione è presente, il codice non verrà compilato se è presente più o meno di 1 metodo astratto. Si consiglia di aggiungere @FunctionalInterface. Ciò ti consentirà di utilizzare l'interfaccia nelle espressioni lambda senza preoccuparti che qualcuno aggiunga un nuovo metodo astratto all'interfaccia e cesserà di essere funzionale. Java dispone di interfacce funzionali integrate ospitate nel formato java.util.function. Non mi soffermerò su di loro in dettaglio. Noto che i più utilizzati sono: Consumer<T> , Function<T,R> , Predicate<T> , Supplier<T> , UnaryOperator<T> e i relativi moduli Bi . Maggiori dettagli possono essere trovati nella pagina della documentazione: Pacchetto 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
    }
}
Ma si scopre che c'è un punto sottile descritto nella specifica del linguaggio Java: "le interfacce non ereditano da Object, ma piuttosto dichiarano implicitamente molti degli stessi metodi di Object." Ciò significa che le interfacce funzionali possono contenere anche metodi astratti definiti nella classe Object. Il codice seguente è valido, non ci saranno errori di compilazione o runtime:
@FunctionalInterface
public interface Comparator<T> {
   int compare(T o1, T o2);
   boolean equals(Object obj);
   // другие default or static методы
}
Fai attenzione durante il colloquio! Buona fortuna!
Commenti
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION