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

Operaciones Terminales

27/39

Lectura

Las operaciones terminales son aquellas operaciones que como resultado no generan un nuevo Stream. Su resultado puede variar según la operación. La utilidad de estas es poder generar un valor final a todas nuestras operaciones o consumir los datos finales. La razón principal para querer esto es que los datos deberán salir en algún punto de nuestro control y es con las operaciones terminales que hacemos esto.

...

Regístrate o inicia sesión para leer el resto del contenido.

Aportes 18

Preguntas 2

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

Acabo de desarrollar un bulto en mi cerebro con el único propósito de procesar como funciona el reduce(valorInicial, BinaryFunction, BinaryOperator)

Por si gustan hacer la ejecución de reduce con 3 argumentos:

Stream<String> aLongStoryStreamAgain = Stream.of("Cuando", "despertó,", "el", "dinosaurio", "todavía", "estaba", "allí.", "Cuando", "despertó,", "el", "dinosaurio", "todavía", "estaba", "allí.", "Cuando", "despertó,", "el", "dinosaurio", "todavía", "estaba", "allí.", "Cuando", "despertó,", "el", "dinosaurio", "todavía", "estaba", "allí.", "Cuando", "despertó,", "el", "dinosaurio", "todavía", "estaba", "allí.", "Cuando", "despertó,", "el", "dinosaurio", "todavía", "estaba", "allí.", "Cuando", "despertó,", "el", "dinosaurio", "todavía", "estaba", "allí.", "Cuando", "despertó,", "el", "dinosaurio", "todavía", "estaba", "allí.", "Cuando", "despertó,", "el", "dinosaurio", "todavía", "estaba", "allí.", "Cuando", "despertó,", "el", "dinosaurio", "todavía", "estaba", "allí.", "Cuando", "despertó,", "el", "dinosaurio", "todavía", "estaba", "allí.", "Cuando", "despertó,", "el", "dinosaurio", "todavía", "estaba", "allí.", "Cuando", "despertó,", "el", "dinosaurio", "todavía", "estaba", "allí.", "Cuando", "despertó,", "el", "dinosaurio", "todavía", "estaba", "allí.", "Cuando", "despertó,", "el", "dinosaurio", "todavía", "estaba", "allí.");
        int charCount = aLongStoryStreamAgain.parallel().reduce(0, (count, word) -> {
            System.out.println("Count: "+ count + " , Word: " + word.length());
            return count + word.length();
        }, (x,y)-> {
            System.out.println("X: "+ x + " , Y: " + y);
            return x + y;
        });
        System.out.println(charCount); 

La operación de reduce de Stream en Java https://www.delftstack.com/es/howto/java/stream-reduce-in-java/

Para el reduce(valorInicial, BinaryFunction, BinaryOperator) tuve que ajustar el stream que fuera de tipo String porque sino me marca error ya que dentro de la lamda no infiere el tipo de los objetos que pasa como parámetros y pongo el código funcional y el error que me marcaba antes, ya que es ilustrativo, adicional, al final dejo el código para que se ejecute el BinaryOperator, ya que solo actúa cuando se opera sobre un parallelStream

Stream<String> aLongStoryStream = Stream.of("Cuando", "despertó,", "el", "dinosaurio", "todavía", "estaba", "allí.");
Integer sumChars = aLongStoryStream.reduce(0, (count, word) -> count+word.length(), (count1,count2) -> count1+count2);
#Result 48

#ERROR:
where U,T are type-variables:
    U extends Object declared in method <U>reduce(U,BiFunction<U,? super T,U>,BinaryOperator<U>)
    T extends Object declared in interface Stream

##Para que se ejecute el BinaryOperator:
Stream<String> aLongStoryStream = Stream.of("Cuando", "despertó,", "el", "dinosaurio", "todavía", "estaba", "allí.");
Integer sumChars = aLongStoryStream.parallel().reduce(0, (count, word) -> count+word.length(), (count1,count2) -> count1+count2);
#Result 48

Me gutaría saber que hace flatMap y que caso de uso práctico se le pude dar.

No logro entender el funcionamiento de reduce(valorInicial, BinaryFunction, BinaryOperator) ni por las curvas, esta como complicadito

Me parece que el reduce(BinaryAccumulator) lo podríamos usar incluso para la secuencia de Fibonacci, o tal vez aluciné xD

El método reduce en Streams de Java te permite combinar todos los elementos de un Stream en un único valor. Puedes pensar en ello como una forma de resumir los elementos del Stream en uno solo.

Los operadores terminales MIN y MAX funcionan al revés en mi código :S

    Stream<Integer> bigNumbers = Stream.of(500,200, 300);
    Stream<Integer> stream = bigNumbers.sorted();
    Optional<Integer> optional = stream.min(Integer::min);
    System.out.println( "Mínimo: " + optional.get() );

    Stream<Integer> bigNumbers1 = Stream.of(500,200, 300);
    Stream<Integer> stream1 = bigNumbers1.sorted();
    Optional<Integer> optional1 = stream1.max(Integer::max);
    System.out.println( "Máximo: " + optional1.get() );

Salida en consola :
Mínimo: 500
Máximo: 200

Un poco confundido con el redue

Interesante API, estudiarla mas a profundidad para impementarla…

Estupendo, muchas gracias instructor Sinuhé por tomarte el tiempo de explicar cada uno de los métodos principales que actúan como operaciones finales para los Stream.

Gracias

Excelente info, gracias

Gracias por la información y resumen 😃

Muy bueno, gracias.

Genial! Aún me falta comprender bien el reduce, pero todo lo demás está claro!