Programación funcional en Java con

Una mónada es solo un monoide en la categoría de endofunctores
Es el proceso de creación de software mediante la composición de funciones
Programación funcional
Es el proceso de creación de software mediante la composición de funciones
Programación funcional
El código funcional tiende a ser más conciso, más predecible y más fácil de probar
Vavr es una biblioteca funcional para Java 8+ que proporciona
tipos de datos y estructuras de control funcional
VAVR
Programación Funcional (conceptos basicos)
Lambda ...
Efectos secundarios
Una función o expresión tiene un efecto secundario si modifica algún estado fuera de su entorno local, es decir, tiene una interacción observable con el mundo exterior además de devolver un valor
Efectos secundarios
Una función o expresión tiene un efecto secundario si modifica algún estado fuera de su entorno local, es decir, tiene una interacción observable con el mundo exterior además de devolver un valor
- Cambiar objetos o variables en el lugar
Efectos secundarios
Una función o expresión tiene un efecto secundario si modifica algún estado fuera de su entorno local, es decir, tiene una interacción observable con el mundo exterior además de devolver un valor
- Cambiar objetos o variables en el lugar
- Imprimir en la consola
Efectos secundarios
Una función o expresión tiene un efecto secundario si modifica algún estado fuera de su entorno local, es decir, tiene una interacción observable con el mundo exterior además de devolver un valor
- Cambiar objetos o variables en el lugar
- Imprimir en la consola
- Escribir en un archivo
Efectos secundarios
Una función o expresión tiene un efecto secundario si modifica algún estado fuera de su entorno local, es decir, tiene una interacción observable con el mundo exterior además de devolver un valor
- Cambiar objetos o variables en el lugar
- Imprimir en la consola
- Escribir en un archivo
- Escribir en una base de datos
Transparencia referencial
Una función o una expresión, se llama referencialmente transparente si una llamada puede ser reemplazada por su valor sin afectar el comportamiento del programa
// not referentially transparent
Math.random();
// referentially transparent
Math.max(1, 2);Valores inmutables
- Son inherentemente seguros para subprocesos y, por lo tanto, no necesitan estar sincronizados
- Son inherentemente seguros para subprocesos y, por lo tanto, no necesitan estar sincronizados
- No necesita ser clonado
- Son inherentemente seguros para subprocesos y, por lo tanto, no necesitan estar sincronizados
- No necesita ser clonado
- El problema con el estado compartido es que para comprender los efectos de una función, debe conocer el historial completo de cada variable compartida que la función utiliza o afecta.
...
Estructuras de datos funcionales
(Código...)
Funciones
(Código...)
Datatypes
Un datatype es una abstracción que encapsula un patrón de codificación reutilizable.
Datatypes
Un datatype es una abstracción que encapsula un patrón de codificación reutilizable.
Nos permite modelar efectos.
Option
Modela el efecto de la opcionalidad (ausencia potencial de un valor).
Representa un valor opcional

(Código...)
try {
// Block of code to try
}
catch(Exception e) {
// Block of code to handle errors
}Los problemas con excepciones
Las excepciones se pueden ver como una declaración GOTO dado que interrumpen el flujo del programa saltando de regreso a la persona que llama
Las excepciones no son consistentes, ya que lanzar una excepción puede no sobrevivir a los límites asíncronos
Las excepciones no son consistentes, ya que lanzar una excepción puede no sobrevivir a los límites asíncronos
(Una función que es asíncrona dentro de un try/catch no puede capturar la excepción potencialmente lanzada en un hilo diferente)
A menudo conducen a un código incorrecto y peligroso porque Throwable es una jerarquía abierta donde puedes capturar más de lo que originalmente pensabas.
Las excepciones son costosas de crear. Throwable intenta recopilar toda la información de la pila para presentarte un seguimiento de pila significativo.
Try
Modela el efecto de los fallos (gestiona las excepciones como efectos).
Representa un calculo que puede generar una excepción o devolver un valor
Try
Modela el efecto de los fallos (gestiona las excepciones como efectos).
Representa un calculo que puede generar una excepción o devolver un valor
Hace explícito que puede fallar

(Código...)
Either
Modela el efecto del fallo y el éxito
Errores como parte del dominio

(Código...)
// Scala
def foo(n: Int): Either[String, Int] = {
if (n % 2 == 0)
Right(1)
else Left("Error")
}
def bar = Right(2)
for {
x <- foo(2)
y <- bar
} yield x + y// Rust
fn foo(n: i32) -> Result<i32, String> {
if n % 2 == 0 {
Ok(1)
} else { Err(String::from("Error")) }
}
fn bar() -> Result<i32, String> {
Ok(2)
}
fn foo_bar() -> Result<i32, String> {
let res = foo(2)? + bar()?;
Ok(res)
}
let fb = foo_bar();Future
Modela la latencia como efecto. (Maneja tanto la latencia como las excepciones como efectos)
Executor
newSingleThreadExecutor
newScheduledThreadPool
newCachedThreadPool
newFixedThreadPool
(Código...)
Validation
Devuelve el resultado de agregar múltiples cálculos que pueden fallar. (Se usa para acumular errores)
(Código...)
Conclusión
Gracias
Programación funcional en Java con VAVR
By maocq
Programación funcional en Java con VAVR
- 338