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.
La presenza di 1 metodo astratto è l'unica condizione, quindi un'interfaccia funzionale può contenere anche
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
default
metodi 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
.
Cos'altro leggere: |
---|
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!
GO TO FULL VERSION