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

Comprendiendo la sintaxis de las funciones lambda

18/39
Recursos

Aportes 25

Preguntas 3

Ordenar por:

驴Quieres ver m谩s aportes, preguntas y respuestas de la comunidad?

He creado un meme 馃檭

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.

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

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

este man es muy bueno pero desordenado para explicar, creo que udemy tiene un mejor curso

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 鈥渦sarAlgo鈥 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.