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. Invierte en tu educación con el precio especial

Antes: $249

Currency
$209

Paga en 4 cuotas sin intereses

Paga en 4 cuotas sin intereses
Suscríbete

Termina en:

12 Días
12 Hrs
17 Min
3 Seg

Entendiendo dos jugadores clave: SAM y FunctionalInterface

15/39
Recursos

Aportes 29

Preguntas 7

Ordenar por:

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

Notes:

  1. SAM is the abbreviation of Single Abstract Method.

  2. A functional interface is an interface that contains only one abstract method. They can have only one functionality to exhibit. From Java 8 onwards, lambda expressions can be used to represent the instance of a functional interface. A functional interface can have any number of default methods. Runnable, ActionListener, Comparable are some of the examples of functional interfaces.Before Java 8, we had to create anonymous inner class objects or implement these interfaces.

  3. @FunctionalInterface annotation is used to ensure that the functional interface can’t have more than one abstract method. In case more than one abstract methods are present, the compiler flags an ‘Unexpected @FunctionalInterface annotation’ message. However, it is not mandatory to use this annotation.

Para evitar la validación de agregar ceros se puede mejorar utilizando el formateador de la siguiente forma:
String.format("%02d ", days);

Este curso me vuela el cerebro.

Interfaces SAM y FunctionalInterface

Java tiene incorporadas las interfaces necesarias para crear funciones que reciban uno o dos parámetros de tipos diferentes, pudiendo especificar también el tipo de retorno, pero también es posible definir interfaces personalizadas que cumplan la misma funcion, pero que permita la utilización de más parámetros o fijar su tipo para no tener que especificarlos al definirlas.

Para hacerlo, basta con crear una interfáz SAM (Single Abstract Method) y agregar la anotación @FunctionalInterface

Por ejemplo, se puede definir una interfaz que permita crear funciones con tres parámetros.

@FunctionalInterface
public interface TriFunction<T, U, V, R> {
    R apply(T t, U u, V v);
}

Su utilización es similar a Function.

//       si x ____ y
// entonces z ____ ?
TriFunction<Integer, Integer, Integer, Double> reglaDeTres = (x, y, z) -> Double.valueOf(y * z / x);

Double resultado = reglaDeTres.apply(5, 30, 15); // retorna 90

Muchas gracias instructor Sinuhé, entonces por medio del uso de SAM y FunctionalInterface tendremos una forma de crear funciones que utilicen más de dos parámetros de ingreso.

Buenas, durante el vídeo el profesor indica que lo que vamos a calcular la edad, pero existe un pequeño error en el código. Lo que nuestra función calculateAge hace es obtener la diferencia de días y con esto no se obtiene la edad. La corrección es muy simple, solo se tiene que remplazar el getDays por getYears

Les comparto como quedaría la modificación

TriFunction<Integer,Integer,Integer,Integer> calculateAge =
                (day, month, year) -> Period.between(
                            parseDate.apply(day, month, year),
                            LocalDate.now()
                        ).getYears();

O se utiliza LocalDate#of(int year, int month, int dayOfMonth) en lugar de un hack innecesario.

SAM --> Single Abstrab Method, Es una interfaz que tiene un solo método sin definir. Para ello decoramos con @FuctionalInterface. Nos permite crear nuestras propias funciones.

En mi caso getDays() no funciono de forma correcta, probe con getYears() y funciono sin problemas.

En esta clase falto explicar que una SAM solo tiene un método abstracto al igual que una Functionl Interface. Pero en una functional interface además puedes definir métodos por defecto y métodos estáticos: ```js @FunctionalInterface public interface Calculadora { int operar(int a, int b); // Un método por defecto default void mostrarResultado(int resultado) { System.out.println("El resultado es: " + resultado); } // Un método estático static void mostrarMensaje() { System.out.println("Ejecutando operación..."); } } ```Para su implementación: ```js public class Main { public static void main(String[] args) { Calculadora suma = (a, b) -> a + b; int resultado = suma.operar(5, 3); suma.mostrarResultado(resultado); // Imprime: El resultado es: 8 Calculadora.mostrarMensaje(); // Imprime: Ejecutando operación... } } ```Por lo tanto toda SAM es una Functional Interface pero no toda Functional Interface es una SAM pues las Functional Interface puede tener mas métodos además del método abstracto.
Hola, no entendí la razon de agregar los ceros
Super interesante esta clase y las posibilidades que ofrece

en mi trifuncion tuve que usar applay xq apply no me deja.

“La anotación @FunctionalInterface no es estrictamente necesaria para que una interfaz sea funcional, pero proporciona una forma explícita de indicar las intenciones del programador. Además, el uso de la anotación permite que el compilador realice verificaciones adicionales, lo que ayuda a evitar errores al usar interfaces funcionales.”

now() = 2019

22:27

SAM es Single Abstract Method, es una interface que debe tener solo un método.

Functional Interface: para que un interface se vuelva funcional, tiene que ser una SAM, sino es así, Java no me va a dejar volverla funcional

Sin la anotacion tambien funciona.
en realidad el unico valor que le agrega la anotacion es que valida que tenga un solo metodo.

Aso no tenga la anotacion. sino si una intefaz solo tiene un metodo abtracto. es considerada funcional.

Vale entonces para hacer nuestras propias funciones Funcionales solo necesitamos de una interfaz y la anotación @FunctionalInterface que maravilla

Esta clase me encantó, muy útil esta información y el ejemplo está perfecto aplicando lo visto hasta ahora.

Esta clase fue colosal, me encantó.

en function addCeros que quiere decir el símbolo “?”

Muchas gracias

Genial 😃 gracias… me corrió sin problemas el ejercicio 😃

Bien, me encantó. Algo nuevo… 😉

Increible

public class AgeUtils {
    public static void main(String[] args) {
        Function<Integer, String> addZero = x -> x < 10 ? "0" + x : String.valueOf(x);

        ITryFunction<Integer, Integer, Integer, LocalDate> parseDate =
                (day, month, year) -> LocalDate.parse(year + "-" + addZero.apply(month) + "-" + addZero.apply(day));

        ITryFunction<Integer, Integer, Integer, Integer> calculateAge =
                (day, month, year) -> Period.between(parseDate.apply(day, month, year), LocalDate.now()).getYears();

        System.out.println(calculateAge.apply(13, 9, 1996));
    }

    @FunctionalInterface
    interface ITryFunction<T, U, V, R>{
        R apply(T t, U u, V v);
    }
}

Muy bien Explicado

Perfecto con esto puedo generar funciones simples a la medida del proyecto que estemos desarrollando, de manera de evitar que se repitan operaciones a lo largo del proyecto.

Define que una interfaz se va a usar como una función