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?

o inicia sesi贸n.

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); 

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 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.

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

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

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

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

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!