Nuove interfacce funzionali e riferimenti ai metodi Java 8 mediante l' ::
operatore.
Java 8 è in grado di mantenere i riferimenti ai metodi (MyClass :: new) con puntatori " @ Functional Interface ". Non è necessario lo stesso nome del metodo, è richiesta solo la stessa firma del metodo.
Esempio:
@FunctionalInterface
interface CallbackHandler{
public void onClick();
}
public class MyClass{
public void doClick1(){System.out.println("doClick1");;}
public void doClick2(){System.out.println("doClick2");}
public CallbackHandler mClickListener = this::doClick;
public static void main(String[] args) {
MyClass myObjectInstance = new MyClass();
CallbackHandler pointer = myObjectInstance::doClick1;
Runnable pointer2 = myObjectInstance::doClick2;
pointer.onClick();
pointer2.run();
}
}
Quindi, cosa abbiamo qui?
- Interfaccia funzionale: si tratta di un'interfaccia, annotata o meno con @FunctionalInterface , che contiene solo una dichiarazione del metodo.
- Riferimenti ai metodi - questa è solo una sintassi speciale, assomiglia a questa, objectInstance :: methodName , niente di più niente di meno.
- Esempio di utilizzo: solo un operatore di assegnazione e quindi interfaccia con il metodo di chiamata.
DOVREI UTILIZZARE LE INTERFACCE FUNZIONALI SOLO PER GLI ASCOLTI E SOLO PER QUESTO!
Perché tutti gli altri puntatori di funzioni di questo tipo sono davvero dannosi per la leggibilità del codice e per la capacità di comprensione. Tuttavia, a volte i riferimenti ai metodi diretti sono utili, ad esempio foreach.
Esistono diverse interfacce funzionali predefinite:
Runnable -> void run( );
Supplier<T> -> T get( );
Consumer<T> -> void accept(T);
Predicate<T> -> boolean test(T);
UnaryOperator<T> -> T apply(T);
BinaryOperator<T,U,R> -> R apply(T, U);
Function<T,R> -> R apply(T);
BiFunction<T,U,R> -> R apply(T, U);
//... and some more of it ...
Callable<V> -> V call() throws Exception;
Readable -> int read(CharBuffer) throws IOException;
AutoCloseable -> void close() throws Exception;
Iterable<T> -> Iterator<T> iterator();
Comparable<T> -> int compareTo(T);
Comparator<T> -> int compare(T,T);
Per le versioni precedenti di Java, dovresti provare Guava Libraries, che ha funzionalità e sintassi simili, come Adrian Petrescu ha menzionato sopra.
Per ulteriori ricerche, consultare il foglio informativo di Java 8
e grazie al link The Guy with The Hat for the Java Language Specification §15.13 .