Como aprendizaje de Java programador no Java, estoy leyendo acerca Supplier
y Consumer
las interfaces en el momento. Y no puedo entender su uso y significado. ¿Cuándo y por qué utilizaría estas interfaces? ¿Alguien puede darme un ejemplo simple de un profano de esto? Encuentro que los ejemplos de Doc no son lo suficientemente breves para mi comprensión.
101
Consumer
ySupplier
también puede buscar el tutorial paraConsumer
...Respuestas:
Este es el proveedor:
Este es el consumidor:
Entonces, en términos simples, un proveedor es un método que devuelve algún valor (como en su valor de retorno). Considerando que, un consumidor es un método que consume algún valor (como en el argumento del método) y realiza algunas operaciones sobre ellos.
Aquellos se transformarán en algo como esto:
En cuanto al uso, el ejemplo muy básico sería:
Stream#forEach(Consumer)
método. Se necesita un consumidor, que consume el elemento de la secuencia sobre la que está iterando y realiza alguna acción en cada uno de ellos. Probablemente los imprima.fuente
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. AList
es un contenedor de otros objetos. Tienen una secuencia y un índice. El número de objetos contenidos en la lista es devuelto porsize()
. Cada objeto tiene un índice en el rango 0..tamaño-1 (inclusive). El objeto en el índice i se puede recuperar llamandolist.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í comoFunction<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 deFunction<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 lajava.util.Map<K,V>
API, existe lo siguiente:(comodines omitidos por brevedad)
Ah, este uso de
Function
es como una "función de mapeo". ¿Qué hace eso? En este contexto, si aúnkey
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.fuente
A
Supplier
es cualquier método que no toma argumentos y devuelve un valor. Su trabajo es, literalmente, proporcionar una instancia de una clase esperada. Por ejemplo, cada referencia a un método 'getter' es unaSupplier
Su referencia de método de instancia
myClass::getCount
es una instancia deSupplier<Integer>
.A
Consumer
es cualquier método que toma argumentos y no devuelve nada. Se invoca por sus efectos secundarios. En términos de Java, aConsumer
es un modismo para unvoid
método. Los métodos 'setter' son un buen ejemplo:Su referencia de método de instancia
myClass::setCount
es una instancia deConsumer<Integer>
yIntConsumer
.A
Function<A,B>
es cualquier método que toma un argumento de un tipo y devuelve otro. Esto puede denominarse "transformación". ElFunction<A,B>
toma anA
y devuelve aB
. Es de destacar que para un valor dado deA
, la función siempre debe devolver un valor específico deB
.A
yB
de hecho puede ser del mismo tipo, como el siguiente:Su referencia de método de instancia
myClass:addTwo
es ayFunction<Integer, Integer>
aToIntFunction<Integer>
.Una referencia de método de clase a un captador es otro ejemplo de función.
Su referencia de método de clase
MyClass::getCount
es una instancia deFunction<MyClass,Integer>
yToIntFunction<MyClass>
.fuente
¿Por qué se definen consumidor / proveedor / otras interfaces funcionales en el paquete java.util.function ? El consumidor y el proveedor son dos, entre muchas, de las interfaces funcionales integradas que se proporcionan en Java 8. El propósito de todas estas interfaces funcionales integradas es proporcionar una "plantilla" lista para interfaces funcionales que tengan descriptores de función comunes (firmas / definiciones de métodos funcionales).
Digamos que tenemos un requisito para convertir un tipo T a otro tipo R. Si tuviéramos que pasar cualquier función definida como esta como un parámetro a un método, entonces ese método necesitaría definir una Interfaz Funcional cuyo método funcional / abstracto toma parámetro de tipo T como entrada y da un parámetro de tipo R como salida. Ahora, podría haber muchos escenarios como este y los programadores terminarían definiendo múltiples interfaces funcionales para sus necesidades. Para evitar este tipo de escenario, facilitar la programación y traer un estándar común en el uso de interfaces funcionales, se ha definido un conjunto de interfaces funcionales integradas como Predicado, Función, Consumidor y Proveedor.
Qué hace el consumidor : la interfaz funcional del consumidor acepta una entrada, hace algo con esa entrada y no da ninguna salida. Su definición es así (de Java Source):
Aquí accept () es el método funcional \ abstracto que toma una entrada y no devuelve ninguna salida. Entonces, si desea ingresar un Integer, haga algo con él sin salida, entonces, en lugar de definir su propia interfaz, use una instancia de Consumer.
Qué hace el proveedor : la interfaz funcional del proveedor no toma ninguna entrada pero devuelve una salida. Se define así (de Java Source):
Siempre que necesite una función que devuelva algo, digamos un entero, pero no toma salida, use una instancia de Supplier.
En caso de que se necesite más claridad, junto con el uso de ejemplos, de las interfaces de consumidor y proveedor, puede consultar las publicaciones de mi blog en el mismo: http://www.javabrahman.com/java-8/java-8-java-util- function-consumer-tutorial-with-examples / y http://www.javabrahman.com/java-8/java-8-java-util-function-supplier-tutorial-with-examples/
fuente
1. Significado
Vea mis respuestas a mi pregunta aquí y también otra aquí , pero en resumen, estas nuevas interfaces proporcionan convenciones y descripciones para que todos las usen (+ encadenamiento de métodos funky como
.forEach(someMethod().andThen(otherMethod()))
2. Diferencias
Consumidor : toma algo, hace algo, no devuelve nada:
void accept(T t)
Proveedor: no toma nada, devuelve algo:
T get()
(al revés de Consumer, básicamente un método universal 'getter')3. Uso
Proveedor: envuelve código repetitivo, por ejemplo, tiempo de ejecución de código
fuente
En términos simples,
proveedor proporcionará datos pero sin consumir ningún dato. En términos de programación, un método que no toma ningún argumento pero devuelve un valor. Se utiliza para generar nuevos valores.
http://codedestine.com/java-8-supplier-interface/
el consumidor consumirá datos pero no devolverá ningún dato. En términos de programación, un método que toma múltiples argumentos y no devuelve ningún valor.
http://codedestine.com/java-8-consumer-interface/
fuente
El consumidor y el proveedor son las interfaces proporcionadas por java. El consumidor se usa para iterar sobre los elementos de la lista y el proveedor se usa para los objetos de suministro.
se puede entender fácilmente con la demostración del código.
Consumidor
Proveedor
fuente
La respuesta más simple puede ser:
Un consumidor puede verse como una función <T, nula>. Un proveedor puede verse como una función <Void, T>.
fuente