Introducción a la programación Funcional

1

Programación Funcional en Java: Conceptos y Aplicaciones Prácticas

Entendiendo las partes de la programación funcional

2

Funciones en Programación Funcional: Conceptos Básicos

3

Funciones como Ciudadanos de Primera Clase en Programación

4

Funciones Puras: Concepto y Ejemplos Prácticos

5

Efectos Secundarios en Programación y su Impacto en el Código

6

Funciones de Orden Superior en Programación

7

Funciones Lambda en Programación Funcional Java

8

Inmutabilidad de Datos en Programación Funcional con Java

Functional Programming en Java

9

Programación Funcional en Java SE: Conceptos y Prácticas

10

Programación Funcional en Java: Práctica y Ejemplos en IntelliJ

11

Programación Funcional en Java: Creación y Uso de Funciones

12

Programación Funcional con Predicados en Java

13

Interfaz Consumer y Supplier en Java: Uso y Ejemplos Prácticos

14

Funciones Java para Transformación de Datos y Operaciones Binarias

15

Creación y Uso de Interfaces Funcionales Personalizadas en Java

16

Métodos de Referencia en Programación Funcional Java

17

Inferencia de tipos en Java: funciones y métodos

18

Uso de Expresiones Lambda en Java: Sintaxis y Aplicaciones

19

Interfaz Funcional en Java: Creación y Uso de Métodos Default

20

Encadenamiento de Llamadas en Programación Orientada a Objetos

21

Composición de Funciones en Programación Funcional

Optional y Streams: Datos mas interesantes

22

Uso de la Clase Optional en Java para Manejo de Valores Nulos

23

Manipulación de Streams en Java: Operaciones y Limitaciones

24

Programación Funcional en Java: Uso de Streams y Operaciones Terminales

25

Operaciones de Stream en Java: Intermedias y Finales

26

Operaciones y Concurrente con Stream en Java

27

Operaciones Terminales en Java Streams

28

Operaciones Intermedias en Streams de Java

29

Conversión de Strings a Listas de Enteros en Java

Todo junto: Proyecto Job-search

30

Construcción de Proyecto para Buscar Empleo Usando APIs

31

Configuración y Uso de Gradle en Proyectos Java con IntelliJ

32

Creación de una Herramienta de Búsqueda de Trabajo en Terminal

33

Creación de Puntos de Entrada y Dependencias en Proyectos Java

34

Creación de APIs RESTful con Feign y Spring Boot

35

Creación de una Interfaz de Línea de Comandos con JCommander

36

Validación de Argumentos en Terminal con Clases en Ciel

37

Procesamiento de Argumentos y Solicitudes API en Java

38

Creación de API para búsqueda de empleos con Java y CLI

Conclusiones

39

Programación Funcional en Java: Conceptos y Aplicaciones

No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

Programación Funcional en Java: Uso de Streams y Operaciones Terminales

24/39
Recursos

¿Cómo mejorar la legibilidad del código con Streams en Java?

Java ofrece funcionalidades avanzadas para trabajar con colecciones de datos de manera más eficiente y legible mediante el uso de Streams. Con esta herramienta, ya no es necesario almacenar el resultado de cada iteración; en su lugar, podemos realizar operaciones directamente sobre los elementos, mejorando la claridad y funcionalidad del código.

¿Qué es un Stream en Java?

Un Stream es una secuencia de elementos sobre la que se pueden realizar diversas operaciones. La principal ventaja de los Streams es que permiten realizar operaciones en cadena sobre una colección, haciendo que el código sea más claro y fluido.

En Java, puedes convertir fácilmente una colección a un Stream y realizar operaciones de manera intuitiva. Ejemplo de cómo crear un Stream:

List<String> courses = Arrays.asList("Java", "Python", "JavaScript");
String result = courses.stream()
    .filter(c -> c.contains("Java"))
    .collect(Collectors.joining(", "));

System.out.println(result);  // Output: "Java, JavaScript"

¿Cuáles son los tipos de operaciones en Streams?

Existen dos tipos de operaciones principales en Streams:

  • Operaciones intermedias: Generan un nuevo Stream. Como su nombre indica, son intermedias y usualmente no producen resultados inmediatos. Ejemplos incluyen filter, map, y sorted.

  • Operaciones terminales: Estas completan el procesamiento del Stream y devuelven un resultado final, como un valor o una colección. Ejemplo de operaciones terminales son forEach, collect, y reduce.

stream.filter(...)
      .map(...)
      .collect(...);  // Collect es una operación terminal

Una forma sencilla de diferenciarlas es: si una operación devuelve un Stream, es intermedia; si devuelve cualquier otro tipo de dato, es terminal.

¿Cómo se utiliza el método peek para depuración?

Uno de los métodos particularmente útiles para la depuración en Streams es peek. Este permite observar los elementos de un Stream sin modificarlo. Es como un microscopio que muestra lo que ocurre dentro del Stream.

courses.stream()
    .filter(c -> c.contains("Java"))
    .peek(System.out::println)
    .collect(Collectors.toList());

Aquí, peek imprime cada elemento que pasa por el filtro, permitiendo comprobar qué datos se están procesando.

¿Por qué usar Streams en lugar de Listas?

El uso de Streams sobre las listas tradicionales presenta varias ventajas:

  • Mayor legibilidad: Las operaciones en cadena ofrecen un flujo de código más claro y comprensible.
  • Facilidad de uso: Puedes realizar múltiples operaciones sobre los elementos sin tener que tratar cada elemento individualmente.
  • Seguridad y funcionalidad: Al trabajar con opcionales y funciones de orden superior como filter y map, puedes manejar la presencia o ausencia de datos de maneras más seguras y limpias.

Streams ofrecen la posibilidad de realizar operaciones complejas en un menor número de líneas, lo que no solo ahorra tiempo sino que también reduce la posibilidad de errores humanos.

A medida que avanzas en el uso de Streams, notarás que proporcionan una forma más dinámica y poderosa de trabajar con colecciones en Java, incrementando tanto la usabilidad como la eficacia de tu código. ¡Sigue explorando y mejorando tus habilidades para dominar esta poderosa herramienta!

Aportes 14

Preguntas 3

Ordenar por:

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

He seguido con atención los cursos de Backend en Java y hasta ahora no he visto nada de Generics (lo que sé de Generics lo aprendí por cuenta). En este curso se utiliza mucho ejemplos con generics. El curso de Avanzado de Java SE debe tocar de formas mas profunda Java Collections y Generics.

Intermediate Operations:

  1. map: The map method is used to returns a stream consisting of the results of applying the given function to the elements of this stream.
    List number = Arrays.asList(2,3,4,5); List square = number.stream().map(x->x*x).collect(Collectors.toList());

  2. filter: The filter method is used to select elements as per the Predicate passed as argument.
    List names = Arrays.asList("Reflection","Collection","Stream"); List result = names.stream().filter(s->s.startsWith("S")).collect(Collectors.toList());

  3. sorted: The sorted method is used to sort the stream.
    List names = Arrays.asList("Reflection","Collection","Stream"); List result = names.stream().sorted().collect(Collectors.toList());

Terminal Operations:

  1. collect: The collect method is used to return the result of the intermediate operations performed on the stream.
    List number = Arrays.asList(2,3,4,5,3); Set square = number.stream().map(x->x*x).collect(Collectors.toSet());

  2. forEach: The forEach method is used to iterate through every element of the stream.
    List number = Arrays.asList(2,3,4,5); number.stream().map(x->x*x).forEach(y->System.out.println(y));

  3. reduce: The reduce method is used to reduce the elements of a stream to a single value.
    The reduce method takes a BinaryOperator as a parameter.
    List number = Arrays.asList(2,3,4,5); int even = number.stream().filter(x->x%2==0).reduce(0,(ans,i)-> ans+i);

siempre sera una operacion final cuando retorna algo que no sea otro stream, si retrona un stream sera una operacion intermedia

Ejemplo básico del uso de peek:

List<String> stringList = UtilsName.getList("123456", "1", "12", "1234", "555");

stringList.stream()
        .peek(number -> System.out.println("Dato: " + number))
        .filter(number -> number.contains("34"))
        .peek(number -> System.out.println(" - Este dato contiene 34"))
        .map(number -> " - Contenido adicional para el Print del Foreach " + number)
        .forEach(System.out::println);
Dato: 123456
 - Este dato contiene 34
 - Contenido adicional para el Print del Foreach 123456
Dato: 1
Dato: 12
Dato: 1234
 - Este dato contiene 34
 - Contenido adicional para el Print del Foreach 1234
Dato: 555

OK entonces los Stream no parecen tan utiles si en cada operacion ten emos que generar un nuevo tipo de variable, esto haria que el codigo sea muuy feo, Pero lo vimos en el modulo anterior... CHEINING. ES NUESTRA SOLUCION

Operacion final si te regresa algo o no, si te regresa un string es una operaciones intermedia

Estupenda clase instructor Sinuhé, por medio del uso chaining se puede aprovechar mucho más los streams.

void es un dato final

“Una vez consumido un Stream ya no puede volver a utilizarse”

Los Stream permiten realizar operaciones en los datos de manera más concisa y eficiente en comparación con los enfoques tradicionales que implican bucles explícitos. Puedes realizar operaciones como filtrado, transformación, agrupación y reducción utilizando métodos de Stream.

En Java, Stream es una característica que se introdujo en Java 8 como parte del paquete java.util.stream. Un Stream es una secuencia de elementos que se puede procesar de manera funcional. Proporciona una forma más elegante y declarativa de realizar operaciones en colecciones de datos, como listas, conjuntos y mapas.

Genial.

Super 😃