Nuevas interfaces funcionales de Java 8 y referencias de métodos utilizando el ::
operador.
Java 8 puede mantener referencias de métodos (MyClass :: new) con punteros " @ Functional Interface ". No hay necesidad del mismo nombre de método, solo se requiere la misma firma de método.
Ejemplo:
@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();
}
}
Entonces, ¿qué tenemos aquí?
- Interfaz funcional: esta es una interfaz, anotada o no con @FunctionalInterface , que contiene solo una declaración de método.
- Referencias de métodos: esto es solo una sintaxis especial, se ve así, objectInstance :: methodName , nada más y nada menos.
- Ejemplo de uso: solo un operador de asignación y luego una llamada al método de interfaz.
¡DEBE UTILIZAR INTERFACES FUNCIONALES PARA LOS ESCUCHADORES SOLO Y SOLO PARA ESO!
Debido a que todos los demás punteros de función son realmente malos para la legibilidad del código y para la capacidad de comprender. Sin embargo, las referencias directas de métodos a veces son útiles, con foreach, por ejemplo.
Existen varias interfaces funcionales predefinidas:
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);
Para versiones anteriores de Java, debe probar Guava Libraries, que tiene una funcionalidad y una sintaxis similares, como Adrian Petrescu ha mencionado anteriormente.
Para una investigación adicional, consulte Java 8 Cheatsheet
y gracias a The Guy with The Hat por el enlace §15.13 de la especificación del lenguaje Java .