Lo "nuevo" en Java 8: interfaces funcionales

En Lo nuevo en Java 8 describimos brevemente las expresiones lambda en esta nueva versión de Java. Es necesario asociar a esas expresiones un tipo para de esta manera satisfacer la comprobación de tipos que el lenguaje utiliza. La interfaces funcionales cumplen ese objetivo, además de poder ser usadas como siempre.
Una interfaz funcional es una interfaz que contiene un único método abstracto, además de algunos métodos implementados. Estos últimos se conocen como métodos de default o métodos de extensión virtual. Las interfaces también pueden contener funciones estáticas, aunque esto último nada tiene que ver con el adjetivo funcional que se les da.
Una expresión lambda encapsula una funcionalidad específica y parece "normal" asignarle a ellas un tipo dado por una interfaz que declara la firma de esa función.
Ya estamos acostumbrados a utilizar una interfaz con un solo método para precisamente manipular la funcionalidad de ese método y poder reutilizarlo. El ejemplo más común es el de las interfaces que definen los "event handlers" en Swing y otros APIs.
Java 8 ha querido que ese idiom siga siendo usado para las expresiones lambda, y entonces bautiza a esa categoría de interfaces como interfaces funcionales.
Con propósitos informativos Java 8 define el tipo anotación correspondiente para indicar la intención de que el tipo interfaz anotada va a ser usado para describir una funcionalidad particular. Esa anotación está definida como:
 
y las instancias de las interfaces funcionales podrán crearse con expresiones lambda, con referencias a métodos y con referencia a constructores. El compilador comprobará si una interfaz anotada con este tipo es realmente una interfaz funcional, aunque permitirá (como debe ser) utilizar cualquier interfaz con el propósito de interfaz funcional si ella es realmente una interfaz funcional aunque no esté anotada con esta anotación.
Como es conocido, existen en el lenguaje muchas interfaces funcionales. Algunas de ellas han estado presente desde la primera versión del lenguaje.  , por ejemplo, es una interfaz funcional que incluye sólo un método abstracto  

El paquete  

Este paquete incluye 40+ interfaces funcionales cuya intención es describir funcionalidades "comunes" que usamos en programación. Otros paquetes de "terceros" hacen lo mismo para funciones comunes en sus áreas.
Una de las interfaces funcionales en   es la interfaz  . El código fuente simplificado de esta interfaz es:
 

Esta interfaz representa una función que recibe un argumento y produce un resultado. El método abstracto  , una vez implementado será el usado cuando la expresión lambda sea invocada, siguiendo la sintaxis normal de invocación a funciones.
El ejemplo siguiente ilustra el uso de esta interfaz funcional. Se escriben dos métodos estáticos "generales" para ejecutar cualquier función trigonométrica en un caso y alguna operación que modifica una lista en el segundo. En el primer caso usamos lo nuevo de referencias a métodos para referirnos a algunas de las funciones que brinda la clase   y en el segundo escribimos una expresión lambda muy sencilla "tipada" con esa interfaz funcional:  
 

La ejecución del programa anterior produce el siguiente resultado:
 
and that´s all folks for today.

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de bferro

Algo sobre interfaces funcionales

Espero no sea disfuncional

Interesante

Me gusta cómo va tomando el rumbo Java hacia algo más "funcional", pero dando pasos cortos, a diferencia de lenguajes cómo Scala o Clojure, en especial Clojure que son un tanto más radicales.

Lo interesante del asunto es que, tenemos algunas ventajas de lenguajes más orientados a lo funcional, pero fácil de asimilar, sin tener que cambiar (tanto) nuestra manera de pensar/programar.

Lo que si se echa de menos en comparación con otros lenguajes, y por otros lenguajes me refiero a C#, es la inferencia de tipos en general; algo cómo:
 

Pero sin duda esto da para mucho. Oracle parece estar poniéndose las pilas.

Imagen de Cid

Interfaz funcional un solo metodo abstracto ¿Porque?

Quiero pensar que solo se define un solo metodo abstracto debido a que las interfaces funcionales estan pensadas para ser utilizadas en conjunto con una expresión lambda y no se si tengo bien o no el concepto pero dicha expresión se define como una función anónima, por tal motivo en tiempo de ejecución la JVM debe de asociar el cuerpo de la expresión lambda con el metodo abstracto que se definió en la interface funcional

 

 

Pero quiero entender porque no permitieron que esto se pueda hacer:

 

 

Imagen de julgo

default

default es una palabra reservada y debe ir antes de declarar el método, y al elegir que método abstracto usar se dejaría de implementar los métodos restantes

Imagen de Cid

Se me fue ese error

Ya corregí le puse defaultMethod(), @julgo gracias por corregir mi error, ok entonces si es por lo que comentaba si el segundo ejemplo fuera posible tendría que colocar las dos implementaciones si o si (debido a que son abstractas) y solo se tomaría en cuenta una, por lo tanto siempre estaríamos trabajando de más al implementar uno o más metodos que no usariamos.

Muchas gracias.

SAM interface

 

¡Psst! Oye, Hiroshige... Aunque estas diapositivas son de la era cuando caminaban los dinosaurios, seguramente las encontrarás muy interesantes: Closures in Java and Scala. ¡Espero ayude!

~~~