Introducci贸n a la programaci贸n Funcional

1

驴Qu茅 es la Programaci贸n Funcional?

Entendiendo las partes de la programaci贸n funcional

2

驴Qu茅 es una funci贸n en Java?

3

Funciones como ciudadanos de primera clase

4

Funciones puras

5

Entendiendo los efectos secundarios

6

Funciones de orden mayor

7

Funciones lambda

8

Inmutabilidad

Functional Programming en Java

9

Repositorio del curso

10

Configuraci贸n del entorno de trabajo

11

Revisando el paquete java.util.function: Function

12

Revisando el paquete java.util.function: Predicate

13

Revisando el paquete java.util.function: Consumer y Supplier

14

Revisando el paquete java.util.function: Operators y BiFunction

15

Entendiendo dos jugadores clave: SAM y FunctionalInterface

16

Operador de Referencia

17

Analizando la inferencia de tipos

18

Comprendiendo la sintaxis de las funciones lambda

19

Usando metodos default en nuestras interfaces

20

D谩ndole nombre a un viejo amigo: Chaining

21

Entendiendo la composici贸n de funciones

Optional y Streams: Datos mas interesantes

22

La clase Optional

23

Entendiendo los Streams

24

驴Qu茅 son los Stream listeners?

25

Operaciones y Collectors

26

Streams de tipo espec铆fico y Paralelismo

27

Operaciones Terminales

28

Operaciones Intermedias

29

Collectors

Todo junto: Proyecto Job-search

30

job-search: Un proyecto para encontrar trabajo

31

Vista r谩pida a un proyecto de Gradle

32

Revisando las opciones para nuestro CLI

33

Librer铆as adicionales para nuestro proyecto

34

Entendiendo la API de jobs

35

Dise帽ando las Funciones Constructoras de nuestro Proyecto

36

Agregando validaciones de datos

37

Dise帽ando las funciones de transformacion de datos

38

Creando flujos extras de transformaci贸n de Datos

Conclusiones

39

Un repaso a lo aprendido

No tienes acceso a esta clase

隆Contin煤a aprendiendo! 脷nete y comienza a potenciar tu carrera

Revisando el paquete java.util.function: Consumer y Supplier

13/39
Recursos

Aportes 26

Preguntas 5

Ordenar por:

驴Quieres ver m谩s aportes, preguntas y respuestas de la comunidad?

o inicia sesi贸n.

No me quedaron muy claros los conceptos de Consumer y Supplier asi que investigando y con lo que dijo Sinue en la clase puedo complementar.

Consumer: Es una expresion lambda que acepta un solo valor y no devuelven valor alguno.
Ejemplo: Una funcion que reciba una lista de archivos y borre cada uno de ellos, sin devolver nada.

Supplier: Es una expresion que no tienen par谩metros pero devuelven un resultado.
Ejemplo: Se crea un supplier de tipo CLIArguments llamado generator que no recibe ni un parametro pero que crea un nuevo objeto CLIArguments y retorna generator, Se pueden crear archivos bajo demanda.

Use el concepto anterior del predicate y coloque un ejemplo de como usar el generador con streams.

Les comparto una lectura donde puden ir si no les qued贸 muy claro Predicate, Consumer, Supplier. Link al blog

Consumer

Utilizando la interf谩z Consumer<T> , es posible definir funciones que reciban un par谩metro tipo T y realicen determinadas operaciones con 茅l pero sin retornar ning煤n dato.

Por ejemplo, se puede definir el Consumer guardarPersona que recibe una entidad Persona y simplemente la almacena en la base de datos.

public void save(Persona persona) {
    Consumer<Persona> guardarPersona = p -> {
        if (p != null) {
            this.database.insert(p);
        }
    };

    guardarPersona.accept(persona);
}

Utilizar Consumer es 煤til para evitar duplicar c贸digo dentro de una misma funci贸n, por ejemplo, cuando se necesita hacer una serie de acciones sobre un objeto m谩s de dos veces, y por alguna raz贸n no es posible evitar duplicar el c贸digo.


Supplier

Utilizando la interf谩z Supplier<T> , es posible definir funciones que no reciba ning煤n par谩metro pero s铆 retornen un objeto de tipo T.

Por ejemplo, se puede definir el Supplier generador que retorna una nueva instancia de la entidad Persona.

public Persona getEmpty() {
    Supplier<Persona> generador = () -> new Persona();

    return generador.get();
}

Utilizar Supplier es 煤til para evitar duplicar c贸digo dentro de una misma funci贸n, por ejemplo, cuando se necesita instanciar un objeto rellenando varios atributos con un valor redefinido en m谩s de dos lugares, y por alguna raz贸n no es posible evitar duplicar el c贸digo.

Me estoy emocionando mucho con este tema.

Por cierto, cuando un if tiene una sola linea, podemos evitar las llaves.
Funciona exactamente igual pero queda mas limpio.

if(cliArguments1.isHelp()) System.out.println("Manual solicitado");

Adem谩s, en la funci贸n lambda se puede reemplazar el constructor de clase por una referencia de m茅todo usando ::

Supplier<CLIArguments> generator = CLIArguments::new;

Un buen escenario para poner en pr谩ctica **Consumer **y Supplier es cuando mandas a llamar una lista de entidades de una tabla en BD. Con **Consumer **conviertes las entidades en DTOS y despu茅s lo invocas desde un **Supplier **para que 茅ste genere la lista final.

Consumer:
Se utiliza para ejecutar la misma operaci贸n en un tipo de objeto especifico.

Supplier:
Se utiliza para generar objetos de un tipo.

En apache net beans, puedes mantener presionado Ctrl y hacer click en una Clase que utilices, cuando lo hagas net beans te va a llevar a la definici贸n de esa Clase

Consumer es una Interfaz gen茅rica, funci贸n que tiene como 1 solo par谩metro.
Tiene como m茅todo: accept
<-------->
Supplier es otra interfaz gen茅rica, funci贸n que que encarga de generar datos, proveer datos. 1 solo par谩metro.

Tiene como m茅todo get.

Estoy Waaaouh!! que buen tema.!!!

隆Hola! Investigando sobre este tema, el pr贸posito de los Consumer es proporcionar una forma de realizar una operaci贸n en un objeto sin necesidad de devolver un resultado y de un Supplier es proporcionar valores de manera din谩mica y bajo demanda.

Sinuhe en varias oportunidades haces referencia a los m茅todos pero lo llamas funciones, lo correcto creo que es que creas m茅todos dentro los cuales creas funciones

Ahora en vez de:
Supplier<CLIArguments> generator = () -> new CLIArguments();

Podemos hacer:
Supplier<CLIArguments> generator = CLIArguments::new;

Utilizando methos reference.

las funciones de tipo consumer. pueden ser del tipo impuras, dado que , como en el ejmplo que dio el profe, podrias ir borrando archivos dependiendo de los datosqeu le vayan llegando. Pir lo cual generariaefectos secundarios.

Un consumer recibe un parametro pero NO retorna nada (a diferencia de Function, Predicate o Supplier que si devuelven algo).

Un supplier no recibe ningun parametro, pero retorna algo.

Les dejo una referencia donde se ve una aplicaci贸n del Supplier bajo el patr贸n factory.

https://refactorizando.com/java-supplier-interface/

Saludos!

Excelente

Uso pr谩ctico del consumer, borrado de archivos o reemplazar

En resumen (o por lo que entendi) estas funciones nos permiten consumir una serie de datos que le pasemos sin tener que construir una estructuras con ciclos, y nos permite de igual forma realizar operaciones comunes sobre una serie de par谩metros de manera mas simplificada.

Muy bien, entonces a partir del Consumer vamos a poder realizar acciones a una serie de datos de forma rapida en cambio el Supplier nos ayudara a generar datos en base a las caracter铆sticas que le brindemos a los par谩metros que recibe.

Consumer<T> is an in-built functional interface introduced in Java8 in the java.util.function package. The consumer can be used in all contexts where an object needs to be consumed, i.e. taken as an input and some operation is to be performed on the object without returning any result. A common example of such an operation is printing where an object is taken as input to the printing function and the value of the object is printed. Since Consumer is a functional interface, hence it can be used as the assignment target for a lambda expression or a method reference.

Supplier<T> is an in-built functional interface introduced in Java8 in the java.util.function package. The supplier can be used in all contexts where there is no input but an output is expected. Since Supplier is a functional interface, hence it can be used as the assignment target for a lambda expression or a method reference.

Sigamos

Excelente 馃槂

Lo que entend铆 es que estos son usados cuando solo quieres usar un tipo de dato, ya sea el de entrada o de salida:
Function<Entrada,Salida>
Consumer<Entrada>
Supplier<Salida>