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

Uso de Expresiones Lambda en Java: Sintaxis y Aplicaciones

18/39
Recursos

¿Qué son y cómo se utilizan las funciones lambda en Java?

Las funciones lambda en Java son una herramienta poderosa que permite crear funciones anónimas, facilitando el manejo y manipulación de expresiones funcionales de manera clara y concisa. Estas funciones permiten introducir bloques de código más compactos que pueden ser evaluados en tiempo de ejecución sin necesidad de almacenarse bajo un nombre específico. Aprender a utilizar las funciones lambda correctamente es esencial para cualquier desarrollador que quiera emplear programación funcional en Java.

¿Por qué utilizar funciones lambda?

Las lambdas ofrecen varias ventajas:

  • Mitigan el uso de clases anónimas: Reducen el código redundante y evitan la creación de clases anónimas sin necesidad.
  • Simplifican el código: Permiten expresar comportamientos de manera compacta y clara.
  • Facilitan operaciones en colecciones: Trabajar con streams y otras APIs que utilizan funciones de orden superior es más sencillo y directo.

¿Cómo es la sintaxis de las funciones lambda?

La sintaxis básica de las funciones lambda se puede descomponer en los siguientes elementos:

  1. Parámetros: Se colocan dentro de paréntesis. En caso de varios parámetros, se separan por comas.
  2. Operador 'flecha' ->: Separa los parámetros del cuerpo de la función.
  3. Cuerpo: Puede ser una sola expresión o un bloque de sentencias delimitado por llaves si se trata de múltiples expresiones.

Ejemplo de una función lambda sin parámetros:

Runnable noArguments = () -> System.out.println("Hello World");

Ejemplo de una función lambda con un parámetro y una sola expresión:

Consumer<String> greet = name -> System.out.println("Hello, " + name);

Función lambda con múltiples parámetros y bloque de código:

BiFunction<Integer, Integer, Integer> add = (a, b) -> {
    System.out.println("Adding numbers: " + a + " + " + b);
    return a + b;
};

¿Cómo funcionan las interfaces funcionales en Java?

Las lambdas se implementan generalmente mediante interfaces funcionales, que son interfaces definidas con una sola función abstracta. Esto permite a Java inferir el tipo de la lambda automáticamente, reduciendo así verborrea de código.

Creación de una interfaz funcional:

@FunctionalInterface
public interface Operate {
    int operation(int a, int b);
}

Usarla con una lambda:

Operate addition = (a, b) -> a + b;

¿Cómo se aplican las lambdas en funciones de orden superior?

Java permite que las funciones sean pasadas como argumentos gracias a las lambdas, comúnmente conocidas como higher-order functions. Estas funciones pueden recibir una lambda como argumento o devolver una.

Ejemplo de función de orden superior:

public static void executeOperation(Operate op, int x, int y) {
    int result = op.operation(x, y);
    System.out.println("Result: " + result);
}

executeOperation((a, b) -> a - b, 10, 5); // Resultado: 5

¿Qué consideraciones debemos tener al usar lambdas?

  • Uso de tipos primitivos y tipo de retorno: Al definir lambdas, es importante notar que trabajan sobre objetos y no sobre tipos primitivos. Es necesario utilizar clases envolventes como Integer en lugar de int.
  • Claridad y legibilidad del código: Si bien las lambdas pueden hacer el código más conciso, es importante mantener la legibilidad del código. Esto puede requerir que a veces definamos explícitamente los tipos involucrados.

Al adoptar las lambdas y otras características de la programación funcional, los desarrolladores de Java pueden escribir código más limpio y eficiente, simplificando operaciones que de otra manera serían mucho más complejas. ¡Así que sigue explorando y mejorando tus habilidades con las lambdas en Java!

Aportes 25

Preguntas 3

Ordenar por:

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

He creado un meme 🙃

Estructura Funciones Lambda

Lambda que recibe un parámetro y realiza una operación simple:

text -> System.out.println(text)

Lambda que no recibe parámetros y realiza una operación de retorno simple:

() -> "Hello world"

Lambda que recibe un solo parámetro y realiza una operación de retorno simple:

x -> x % 2 == 0

Lambda que recibe varios parámetros:

(x, y) -> x * y

Lambda que realiza varias operaciones:

(x, y) -> {
  System.out.println("Suma de x: " + x + ", y: " + y);
  System.out.println(x + y);
}

Lambda que realiza varias operaciones y retorno:

(x, y) -> {
  System.out.println("Suma de x: " + x + ", y: " + y);
  return x + y;
}

Lambda con tipado de parámetros:

(String text) -> System.out.println(text);

Lambda que retorna un dato que ocupa varias lineas:

() -> (
  "<div class='movieSearch'>" +
  " <div class='movie-close'>" +
  "   <button class='movie-close-button'>" +
  "     <figure>" +
  "       <img src='src/images/close.png'>" +
  "     </figure>" +
  "   </button>" +
  " </div>" +
  "</div>"
)

Lambda que no recibe por parámetros nada y tampoco retorna nada:

() -> {}
() -> System.out.println("No recibo nada")
() -> {
  System.out.println("No recibo nada");
  System.out.println("No retorno nada");
}

Sintaxis de lambdas

Si la lambda NO recibe argumentos:
( ) -> operación

Si la lambda recibe 1 argumento:
_argumento -> operación
( argumento ) -> operación_

Si la lambda recibe mas de 1 argumento:
( argumento1, argumento2) -> operación

Si la lambda recibe varias operaciones:
( ) -> { operacion1; return operación2; }
argumento -> { operacion1; return operacion2; }
( argumento ) -> { operacion1; return operacion2; }
( argumento1, argumento2) -> { operacion1; return operacion2 }

Si la lambda tiene mas de una operación debemos retornar un valor mediante.
return

Pero si NO devuelve nada, solo hay que indicar el tipo de entrada vacío.

( ) -> { operación }

Para evitar errores es mejor usar
( ) -> { operación }
para cualquier caso.

javascript me preparo para este momento ;D

Lambda expressions basically express instances of functional interfaces (An interface with single abstract method is called functional interface. An example is java.lang.Runnable). lambda expressions implement the only abstract function and therefore implement functional interfaces

Lambda expressions are added in Java 8 and provide below functionalities.

  1. Enable to treat functionality as a method argument, or code as data.

  2. A function that can be created without belonging to any class.

  3. A lambda expression can be passed around as if it was an object and executed on demand.

Cómo puedo agregar esa configuración a mi teclado para la flecha?

Las funciones lambdas solo esta presente en donde se crean y son funciones cortas y simples

package com.platzi.functional._08_lambda;

import com.platzi.functional._06_reference_operator.NombresUtils;

import java.util.List;
import java.util.function.BiFunction;
import java.util.function.Predicate;

public class Sintaxis {
    public static void main(String[] args) {
        List<String> cursos = NombresUtils.getList("Java", "Functional");

        // Esta es una lambda que solo retorna la impresion de un curso
        cursos.forEach(curso -> System.out.println(curso));

        // Una lambda en su minima expresion (solo retorna el 2)
        usarZero(() -> 2);

        // El predicate retorna true o false
        usarPredicado((texto) -> texto.isEmpty());

        // Puede recibir 2 parametros
        usarBiFunction((x, y) -> x * y);

        // Con mas operaciones se debe especificar donde esta el return
        usarBiFunction((x, y) -> {
            System.out.println(x + " + " + y);
            return x + y;
        });

        // Cuando no se recibe nada y no se retorna ningun resultado
        usarNada(() -> {
            System.out.println("No hago nada, porque no retorno nada");
        });

        // Se pueden especificar los tipos de datos pero no es muy comun encontrarlo en proyectos
        usarBiFunction((Integer x, Integer y) -> x * y);

    }

    // estas funciones son high order functions usadas para poder pasar la funciones lambda como parametros
    static void usarZero(ZeroArguments zeroArguments){

    }

    static void usarPredicado(Predicate<String> predicate){

    }

    static void usarBiFunction(BiFunction<Integer, Integer, Integer> biFunction){

    }

    static void usarNada(OperarNada operarNada){

    }

    @FunctionalInterface
    interface ZeroArguments{
        int get();
    }

    @FunctionalInterface
    interface OperarNada{
        void nada();
    }
}

LA MEJOR CLASE 😎

Sintaxis de las funciones lambda


Las funciones Lambda son funciones anónimas, es decir, no están asignadas a variables (Function, Predicate, Consumer, etc), sino que se definen en el momento en que son usadas y al no nombrarse no es posible volverlas a usar.

Por ejemplo, para mostrar una lista de String, es posible utilizar el método forEach que para cada elemento de la lista aplicará la expresión pasada como parámetro.

List<String> numeros = Arrays.asList("uno", "dos", "tres");

numeros.forEach(texto -> System.out.println(texto));

La sintáxis de las Lambdas varía dependiendo de su estructura:

  • Cantidad de paráetros: Cuando no recibe parámetros o recibe dos o más, se deben poner entre paréntesis (x, y) -> ..., pero si sólo es uno no son necesarios.
  • Cantidad de líneas: Si sólo se necesita una línea, puede escribirse a continuación de la -> y no es necesario usar ;. Si son dos o más lineas, se deben usar llaves -> { ... } y ; en cada línea.
  • Retorn o no un dato: Si sólo se necesita una línea para retornar el dato no es necesario usar return.

Justo iba a preguntar que pasaba si la logica era mas grande y fue solo agregar las llaves. Gracias!

Esto me recuerda a las Arrow Functions de Javascript, y hasta su sintaxis es muy similar.

Bien explicado y detallado como para entender… gracias.

¿Alguno sabe como obtener los {} de colores que tiene el profe por jerarquia? es muy util a la hora de debugear

las funciones al ser interfaces trabajan directamentes en objetos mo trabajan sobre de tipos de datos primitivos

Excelente información

Entonces bajo lo que vimos en el video en caso de requerirlo puedo hacer una clase que tenga los métodos “usarAlgo” y llamarlos para crear lamdas sin tener que hacer la declaración larga BiFunction<Integer,Integer,Integer> s = (x,y) -> x*y;

IsEmpty (si es vacio) devuelve un valor de tipo booleano que indica true si el tamaño de la cadena es igual a 0

Gracias por los ejempos… queda mas claro con ello 😃

Muchas gracias por la clase instructor Sinuhé, tendré en cuenta esta herramienta cuando quiera añadir funcionalidades de forma rápida y se usen en sola una ocasión, además de tener cuidado de usar objetos en vez de tipos de datos primitivos para que no se generen errores.

Genial.

Las lambdas no se almacenan en ningún lado, sólo están para una tarea específica.

(x -> x * 2)

Las funciones son interfaces, por lo cual no aceptan Tipo de Dato PRIMITIVO, sino tipo de datos OBJETOS o WRAPPER.

Maneras creativas de definir nuestro código que nos permite realizar operaciones que solo se usaran para esa parte especifica del código, pero soy más partidario de definir los tipos de datos para que sea mucho más fácil de entender el código, aunque con solo leer el código veríamos cual es el tipo pero es más fácil solo verlo.