viernes, 6 de noviembre de 2015

Java 8 - Lambdas (Interfaces funcionales)

Siguiendo con los ejemplos de lambdas, vamos a hablar hoy un poco acerca de las interfaces funcionales en Java 8.

Las interfaces han sido revisadas en la versión 8 de Java, añadiendo capacidad de definir métodos por defecto y métodos estáticos en las mismas. También se introduce el concepto de interfaz funcional.

Una interfaz funcional es aquella en la que solo hay un método abstracto, lo cual por otro lado no es nada nuevo. Mas de una vez hemos tenido que tratar con objetos como Runnable, o definir un Comparator, o usar un Callable. Estas interfaces son conocidas como SAM Interfaces (Simple Abstract Method Interface). Java 8 añade la anotación 'java.lang.FunctionalInterface' mediante la cual podemos anotar una interfaz e indicar de este modo que es una 'interfaz funcional'.

Como ejemplo podemos ver la siguiente

@FunctionalInterface
public interface Greeter {

    String saluda(String name); 
}

Este tipo de interfaces solían ser inicializadas con clases anónimas, o bien en un fichero independiente implementando la misma. Veamos un ejemplo con nuestra interfaz

final Greeter greeterClassic = new Greeter() {

    @Override
    public String saluda(String name) {
        return "Hello " + name;
    }
            
};

Java 8 nos permite inicializar este tipo de interfaces a través de expresiones lambdas, con lo que podríamos hacer lo siguiente para iniciar un objeto de este tipo

final Greeter greeterLambda = (name) -> {return "Hello " + name;};

Las posibilidades ahora son mayores y nuestro código mas compacto, con lo que ganamos en varios aspectos como: legibilidad, mantenibilidad, etc...

Además de esto, algunas interfaces se han actualizado para poder ser inicializadas de esta forma, veamos un ejemplo a continuación de Runnable

final Runnable task = () -> {
     greeterClassic();
     greeterLambda();
};
        
task.run();
Podéis ver un ejemplo de uso de lambdas con colecciones aqui.

Podéis descargar el código de este post en github.

No hay comentarios:

Publicar un comentario