La razón por la que tiene dificultades para comprender el significado de interfaces funcionales como las de java.util.function
es que las interfaces definidas aquí no tienen ningún significado. Están presentes principalmente para representar la estructura , no la semántica .
Esto es atípico para la mayoría de las API de Java. La API de Java típica, como una clase o interfaz, tiene significado, y puede desarrollar un modelo mental para lo que representa y usarlo para comprender las operaciones en ella. Considere, java.util.List
por ejemplo. A List
es un contenedor de otros objetos. Tienen una secuencia y un índice. El número de objetos contenidos en la lista es devuelto por size()
. Cada objeto tiene un índice en el rango 0..tamaño-1 (inclusive). El objeto en el índice i se puede recuperar llamando list.get(i)
. Etcétera.
Las interfaces funcionales en java.util.function
no tienen tal significado. En cambio, son interfaces que simplemente representan la estructura de una función, como el número de argumentos, el número de valores devueltos y (a veces) si un argumento o valor devuelto es una primitiva. Así tenemos algo así como Function<T,R>
lo que representa una función que toma un solo argumento de tipo T y devuelve un valor de tipo R . Eso es. ¿Qué hace esa función? Bueno, puede hacer cualquier cosa ... siempre que tome un solo argumento y devuelva un solo valor. Es por eso que la especificación de Function<T,R>
es poco más que "Representa una función que acepta un argumento y produce un resultado".
Claramente, cuando escribimos código, tiene un significado, y ese significado tiene que venir de alguna parte. En el caso de las interfaces funcionales, el significado proviene del contexto en el que se utilizan. La interfaz Function<T,R>
no tiene significado de forma aislada. Sin embargo, en la java.util.Map<K,V>
API, existe lo siguiente:
V computeIfAbsent(K key, Function<K,V> mappingFunction)
(comodines omitidos por brevedad)
Ah, este uso de Function
es como una "función de mapeo". ¿Qué hace eso? En este contexto, si aún key
no está presente en el mapa, se llama a la función de mapeo y se le entrega la clave y se espera que produzca un valor, y el par clave-valor resultante se inserta en el mapa.
Por lo tanto, no puede mirar la especificación de Function
(o cualquiera de las otras interfaces funcionales, para el caso) e intentar discernir lo que significan. Debe observar dónde se usan en otras API para comprender lo que significan, y ese significado se aplica solo a ese contexto.
Consumer
ySupplier
también puede buscar el tutorial paraConsumer
...