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

No se trata de lo que quieres comprar, sino de quién quieres ser. Aprovecha el precio especial.

Antes: $249

Currency
$209

Paga en 4 cuotas sin intereses

Paga en 4 cuotas sin intereses
Suscríbete

Termina en:

14 Días
6 Hrs
16 Min
54 Seg

Collectors

29/39
Recursos

Aportes 15

Preguntas 1

Ordenar por:

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

boxed() es un metodo de IntStream que convierte el IntStream en un Stream de enteros, es decir, Stream<Integer>

Collectors

Los Collectors son utilizados para convertir un Stream a una estructura de datos que contenga los elementos del flujo (como List o Map), por ende, se trata de una operación terminal.

Por ejemplo, para obtener una List<LocalDate> a partir de fechas dadas como String:

List<String> fechasString = Arrays.asList("2022-01-01", "2022-01-06", "2022-05-01", "2022-11-02", "2022-12-31");

List<LocalDate> fechas = fechasString.stream()
        .map(s -> s.split("-")) //Divido la fecha en un array de strings
        .map(d -> LocalDate.of(Integer.parseInt(d[0]), Integer.parseInt(d[1]), Integer.parseInt(d[2]))) //Convierto el array de strings a LocalDate
        .collect(Collectors.toList()); //Convierto el Stream de LocalDate a List<LocalDate>

Otra conversión frecuente es a Map:

Map<Integer, String> mapaPersonas = listaPersonas.stream()
        .collect(Collectors.toMap(
            p -> p.getId(),  // Key para agregar al Map
            p -> p.getNombre() + " " + p.getApellido() // Value
        ));

IntStream boxed() returns a Stream consisting of the elements of this stream, each boxed to an Integer.

Note: IntStream boxed() is a intermediate operation. These operations are always lazy. Intermediate operations are invoked on a Stream instance and after they finish their processing, they give a Stream instance as output.
Syntax:
Stream<Integer> boxed()
Parameters:
Stream: A sequence of elements supporting sequential and parallel aggregate operations.
Integer: The Integer class wraps a value of the primitive type int in an object. An object of type Integer contains a single field whose type is int.
Return Value: The function returns a Stream boxed to an Integer.

Apuntes
Necesitamos generar un resultado al operar sobre un Stream y como no todos implementan Stream, es decir, un Stream de Java puede que no lo use un cliente en JavaScript o un código en Python o alguna API, entonces debemos hacer que estos datos sean más manejables, convertir el Stream en algo que se pueda operar, no solo en Java, sino desde otros lugares. Vamos a convertir nuestro Stream de enteros a una lista de enteros porque los números los podemos procesar fácilmente.

El resultado del filter lo vamos a convertir a boxed, lo cual representa que nuestro Stream que está trabajando sobre enteros pero de tipo Stream(IntStream) va a convertirse solamente en un Stream de Integer, con boxed hacemos que el Stream trabaje sobre datos específicos, como este caso Integer, no sobre Stream de enteros.
Con lo anterior, podemos recopilar los datos de un Stream en una estructura de datos, aquí entra en juego el método collect.

Con collect podemos dar una manera de convertir un Stream de datos en una estructura ya física, en una estructura que no tiene operadores, simplemente tiene los datos en concreto, que fueron el resultado de aplicar múltiples operaciones a un Stream.

Tenemos Collectors para convertir a mapa, lista, set.

Con Collectors.toList() usamos el que convierte a lista, en este caso devolverá una lista de Integers

You can find more information about ‘toCollection’ method here.

Excelente clase instructor Sinuhé, a través de los métodos .boxed y .collect vamos poder generar una estructura de datos más adaptable de los Stream para poder usarlos externamente.

con boxed convertimos en otro tipo de string

Genial

con collet recogemos esos datos y creamos en una estructura ya fisica o datos en concreto

GRacias

Genial muchas gracias!

¿Hay algo parecido a JOIN de SQL en programación funcional con Java?

Si tuviésemos un Stream<Integer> el cual al final solo me otorga la suma de una cantidad de dígitos en una lista, como podríamos obtener únicamente ese resultado sin bloquear el flujo y sin que este este contenido en un Stream?

Tengo un proyecto con un front y un back, y a su vez necesito consumir un servicio externo.

desde el front envío una lista de elementos que deberán ser procesados consultando ese api de tercero. el tema es que el servicio que debo consultar sólo procesa una petición a la vez y no quiero crear un cuello botella en mi back, por lo que quisiera disparar varias consultas paralelas a ese servicio de terceros.

Se puede hacer este tipo de implementaciones con el parallel de Stream?

Se puede hacer un Collector de una clase especifica? si se recorre un array de string separados por espacio que contiene el valor de los campos de la clase especifica?