PROGRAMACIÓN
FUNCIONAL EN JAVA
P R O G R A M A C I Ó N 3
P R O F . M A N G O E D U A R D O
CONTENIDO
01 Programación funcional
02 Expresiones Lambda
03 Interfaces funcionales
04 Paquete Java Function
Programación Funcional
La programación funcional es un paradigma de programación
que trata la computación como la evaluación de funciones
matemáticas y evita el cambio de estado y los datos mutables.
Se basa en principios como la inmutabilidad, funciones puras y
la composición de funciones.
El desarrollo de software se trata de crear soluciones a
problemas pequeños y después componerlos para solucionar
un problema mayor. Es por eso que un modelo basado en
funciones y en composición de las mismas como únicas
herramientas para crear programas, nos brinda una forma muy
elocuente de crear software.
PRINCIPALES CARACTERISTICAS
Funciones puras: Dado un mismo input siempre
devolvemos el mismo output.
Inmutabilidad: Los datos no se modifican una
vez creados. En su lugar, se crean nuevos datos
Programación transformados.
Funcional Funciones de primera clase: Las funciones se
tratan como cualquier otro valor, pudiendo
pasarse como argumentos o devolverse como
resultados.
Recursividad: Se utiliza la recursión en lugar de
bucles para realizar operaciones repetitivas.
Programación Imperativa
Programación Funcional
Programación Imperativa y
Programación Funcional
Una expresión lambda es una forma de definir una
función anónima que puede pasarse como
argumento a un método o asignarse a una
variable. Son especialmente útiles en combinación
Expresiones con interfaces funcionales y flujos de datos
(Streams).
Lambda
Sintaxis básica
( Parametros ) -> Cuerpo;
( Parametros ) -> { Cuerpo }
Paréntesis ( ) : Contienen los parámetros de la función, es decir, lo que recibe
Operador -> : Separa los parámetros del cuerpo de la función.
Cuerpo { } : Contiene la lógica de la función (Si es una linea, se puede colocar sin
llaves y cerrar con ‘ ; ’).
Si el cuerpo de la expresión lambda es una sola línea y devuelve un valor, el return es
implícito, es decir, no es necesario escribirlo. Si el cuerpo esta entre llaves, es necesario
utilizar return de manera explícita. Si el parámetro es uno solo, tambien se pueden no
colocar los parentesis
( x ) -> {
x -> x * x ; == return x * x;
};
Una interfaz funcional es aquella que tiene un
único método abstracto. Se utilizan
principalmente para la programación funcional y
Interfaces permiten el uso de expresiones lambda y
referencias a métodos.
funcionales Características clave:
Solo puede tener un método abstracto.
Puede contener métodos default y static sin
perder su condición de funcional.
Se puede marcar con la anotación
@FunctionalInterface (opcional pero
recomendable).
Ejemplo Interfaz Funcional
Paquete [Link]
La librería [Link] es un paquete en Java que
contiene una serie de interfaces funcionales diseñadas para
facilitar la programación funcional mediante expresiones
lambda y referencias a métodos.
¿Por qué usar [Link]?
✔ Reduce la necesidad de definir interfaces funcionales
personalizadas.
✔ Mejora la legibilidad y reutilización del código.
✔ Compatible con APIs modernas como Streams y Optional.
Consumer<T>
Representa una operación que acepta un argumento de tipo T y no devuelve ningún
resultado.
Método abstracto:
void accept (T t)
Método Default:
default Consumer<T> andThen (@NotNull Consumer<? super T> after);
Supplier<T>
Representa un proveedor de resultados. No acepta ningún argumento y devuelve un
resultado de tipo T.
Método abstracto:
void get (T t)
Predicate <T>
Representa un predicado (función booleana) que acepta un argumento de tipo T y
devuelve un valor booleano.
Método abstracto:
boolean test (T t)
Métodos Default:
Predicate <T> and (Predicate<? extends T> other)
Predicate <T> negate ( )
Predicate <T> or (Predicate<? extends T> other)
Método Estatico:
Predicate <T> isEqual (Object targetRef)
Predicate <T>
Function <T , R>
Representa una función que acepta un argumento de tipo T y devuelve un resultado de
tipo R.
Método abstracto:
R apply (T t)
Métodos Default:
Function<T, V> andThen (Function<? super R, ? exends V> after)
Function<V,R> compose (Function<? super V, ? extends T> before)
Método Estatico:
Function<T,T> identity ()
Function <T , R>
PROGRAMACIÓN
FUNCIONAL EN JAVA
P R O G R A M A C I Ó N 3
P R O F . M A N G O E D U A R D O
Universidad Tecnológica Nacional de Mar del Plata