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

La clase Optional

22/39
Recursos

Aportes 26

Preguntas 10

Ordenar por:

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

o inicia sesi贸n.

Vale la pena recordar que Opcional se debe usar para informaci贸n que se retorna, en lugar de informaci贸n que se recibe (a trav茅s de par谩metros, por ejemplo). Corregirme si me equivoco.

I recommend you this page.

Pens茅 que esta clase era Opcional , que se pod铆a ver o no, ajajajjaajjaaj

Optional


La clase Optional permite encapsular un dato del cual no se tiene certeza de su valor, evitando la utilizaci贸n de valores null, excepciones NullPointerException y la repetici贸n de verificaciones de tipo dato != null.

Esta clase adem谩s provee m茅todos que pueden ser usados para manejar el dato dentro del Optional, o para contemplar los casos cuando el dato no est谩 presente. Dependiendo del caso estos m茅todos pueden recibir un Function, Consumer, Supplier, etc.

Por ejemplo, la funci贸n getPersona carga desde la base de datos una Persona y la devuelve dentro de un Optional<Persona>.

public Optional<Persona> getPersona(int id) {
    Persona p = database.get(id);
    if (p == null) {
        return Optional.empty();
    } else {
        return Optional.of(p);
    }
    // Tambi茅n podr铆a retornarse Optional.ofNullable(p);
}

Una forma de utilizar el Optional devuelto ser铆a:

Optional<Persona> personaOptional = getPersona(45);

// Si existe la Persona, muestra nombr ey apellido
if (personaOptional.isPresent()) {
    System.out.println(personaOptional.get().getNombre() + " " + perpersonaOptionalsona.get().getApellido());
}

// Lo mismo utilizando Lambda
personaOptional.ifPresent(p -> System.out.println(p.getNombre() + " " + p.getApellido()));

// Lo mismo mapeando a un String con un mensaje en caso de que no exista la Persona
String texto = persona.map(p -> p.getNombre() + " " + p.getApellido())
        .orElse(() -> "No existe");
System.out.println(texto);

// Extrae la Persona dentro del Optional si est谩 presente, de lo contrario, asigna una nueva instancia por defecto
Persona persona = personaOptional.orElse(new Persona());

Me parece excelente, muchos m茅todos y usos aunque tuve que ir a la Api de Java para extender la explicaci贸n ya que aqu铆 solo los mencionas por encima, pero definitivamente muy 煤til la clase. Gracias.

Posdata: les recomiendo ir a la Api tambi茅n. saludos.

RESUMEN

La clase Optional es una manera de almacenar un dato del cual no tenemos certeza cu谩l es el valor, si est谩 o no est谩 presente, y poder acceder a este dato mediante operadores (funciones, consumers, suppliers) que cuando est茅 presente el dato, la clase Optional va a invocar esas funciones pas谩ndoles el dato, en caso contrario (por ejemplo el caso de null) la clase Optional no va a invocar dichas funciones.
Internamente Optional estar谩 haciendo la l贸gica para saber cu谩ndo s铆 y cu谩ndo no ejecutar un pedazo de c贸digo.

Un ejemplo de la clase aplicada.

public class Optional_2 {

    private static void threeDigitNonFunctional(Integer data)  {
        Optional<Integer> dataOptional = Optional.ofNullable(data);
        if (dataOptional.isPresent()) {
            Integer num = dataOptional.get();
            String string = "" + num;
            if (string.length() == 3) {
                System.out.println(string);
            }
        }
    }

    private static void threeDigitFuctional(Integer data) {
        Optional<Integer> dataOptional = Optional.ofNullable(data);

        dataOptional
                .map(num -> "" + num)
                .filter(s -> s.length() == 3)
                .ifPresent(System.out::println);
    }


    public static void main(String[] args) {
        threeDigitNonFunctional(587);
        threeDigitFuctional(687);

        threeDigitNonFunctional(null);
        threeDigitFuctional(null);
    }

}

Con este blog de arquitectura Java, pude comprenderlo mejor.

Se los recomiendo, es muy bueno

https://www.arquitecturajava.com/que-es-un-java-optional/

Optional

  • It helping deal with null values properties
  • Mitigate the risk of running into NullPointerException

Si no quedo muy claro este tema, pueden revisar este video o el blog, donde lo definen a detalle y con ejemplos pr谩cticos

Para un mejor entendimiento, podr铆amos decir que Optional almacena dos valores, por un lado con datos y por otro lado los que no tienen datos, y podemos usarlo a nuestro antojo 馃槃

Si eh llegado a entender, pero, hay muchos defectos en este curso, esta demasiado desordenado, usa metodos que creo fuera de la clase, para usarlos como ejemplo, que le cuesta volverlos a crear para entenderlo, esta muy desordenado

El profe es muy bueno, pero en esta clase al no partir de un ejemplo claro llega un momento en que te pierdes.
Yo porque entiendo de antes los Optional pero entiendo que el que no lo haya visto se tenga que ver este v铆deo a 0.5x varias veces para comprenderlo.

Hice este ejemplo por si a alguien mas le resulta util.

public class Optional2 {
    public static void main(String[] args) {
        ArrayList<String> listaNombres = new ArrayList<>();
        listaNombres.add(0, "Persona 1");
        listaNombres.add(1, "Persona 2");
        listaNombres.add(2, "Persona 3");
        Optional<ArrayList<String>> validarLista = validarAlgo(null);
 // Optional<ArrayList<String>> validarLista = validarAlgo(listaNombres);


        if (validarLista.isPresent()){
            System.out.println("si esta presente");
        }else {
            System.out.println("Optional no esta presente");
        }
//        validarLista.ifPresent(strings -> {
//            System.out.println("si esta presente");
//            strings.forEach(System.out::println);
//        });
    }

    static Optional<ArrayList<String>> validarAlgo(ArrayList lista){
        try {
            System.out.println("Ejecutamos el proceso del try");
            return Optional.ofNullable(lista);
        }catch (IndexOutOfBoundsException exception){
            System.out.println("atrapamos excepcion");
            return Optional.empty();
        }
    }
}

El m茅todo flatMap() recibe por par谩metro una funci贸n (lambda) que ejecuta ciertas instrucciones (seg煤n lo que especifique el programador) y que, y 茅sta es la parte importante, retorna un objeto de tipo Optional<T> (esto es obligatorio, si no, no compila), donde T es un tipo de dato que se especifica en el bloque de c贸digo (la lambda) que se pasa como argumento a flatMap(). Cabe resaltar que el input de esta lambda es uno solo, y 茅ste es autom谩ticamente el valor que el optional sobre el que se est谩 ejecutando el flatMap() encapsula, si es que existe, esto mismo lo hace null safe, porque si es null, es decir, que el optional est谩 vac铆o, entonces no ejecuta nada. Tambi茅n est谩 el caso en que T es un tipo Optional en s铆 (de hecho este es el caso de uso m谩s com煤n), en este caso solo se debe retornar el dato de tipo T.

Para mi fue un poco densa la clase, pero luego de detenerme a digerir el contenido esto esta super util.

Excelente explicacion de los Optional.

La verdad es que el flatMap no me ha quedado nada claro鈥
Hubiera estado bien alg煤n ejemplo.

Otra cosa importante a considerar es que Optional#isPresent (y otros m茅todos) le agregan un overhead, la mayor铆a de veces insignificante, pero que es interesante saber.

Noten el siguiente c贸digo:

public class Main {
    public static void main(String[] args) {
        Optional<String> optional = Optional.of("Java 8");
        optional.ifPresent(Main::uno);
    }

    public static void uno(String str) {
        Optional<String> optional = Optional.of(str + ", Java 9");
        optional.ifPresent(Main::dos);
    }

    public static void dos(String str) {
        Optional<String> optional = Optional.of(str + ", Java 10");
        optional.ifPresent(Main::tres);
    }

    public static void tres(String str) {
        Optional<String> optional = Optional.of(str + ", Java 11");
        optional.ifPresent(s -> new Exception().printStackTrace());
    }
}

En el stack tendremos tres stack frames correspondientes a las llamadas a uno(), dos(), tres(), pero aparte cada una de esas llamadas se hacen mediante isPresent(), entonces hay que sumar otros 3 stack frames, y luego aparte hay que sumarle otros 3 por la invocaci贸n a accept() hecha dentro de la implementaci贸n de isPresent() (ver abajo). Agregar铆a un screenshot de los frames pero no s茅 c贸mo subirlo, need help (no quiero subir la imagen a servicios de terceros). Igual si lo ejecutan al final deben de ver el stacktrace.

As铆 en total tenemos ~9 entradas en el stack. Si no usaramos el isPresent() ese n煤mero se reducir铆a. Esto no quiere decir que es mejor no usar isPresent() porque seguramente es m谩s lo que ganamos al usarlo (el c贸digo es m谩s legible, mantenible y se hace m谩s r谩pido) que lo que ganamos al no usarlo (diminutas diferencias en el performance).

public void ifPresent(Consumer<? super T> action) {
    if (value != null) {
        action.accept(value);
    }
}

馃憜 Implementaci贸n de JDK para Optional#isPresent()

Excelente clase!

Collection.emptyList();

Esta clase va ser muy 煤til para los casos en que la aplicaci贸n tenga funciones donde los datos sean nulos o no est茅n presentes. Muchas gracias por la explicaci贸n instructor Sinuh茅.

Class option controla el return Null

Genial.

Genial 馃槂 muy 煤til