Está en la página 1de 30

Paradigmas de Programación

Sesión10: Programación Funcional


con Java

Escuela de Ingeniería de Computación y Sistemas


Ms. Freddy Infantes Quiroz
finfantesq@upao.edu.pe
Agenda

• POO vs Prog. Funcional


• Lambda
• Streams
• Ejemplo

Ms. Freddy Infantes Quiroz


17

Programación Orientada a Objetos vs


Programación Funcional

POO Programación orientada a Objetos:


¿Cómo?.
PF Programación declarativa: ¿Qué?.
Basado en Funciones: funciones
Abstracción, encapsulamiento,
Lambda.
modularidad, jerarquía.
Sin estado, sin orden y sin efectos
Clases relacionadas mediante
colaterales.
herencia, composición, agregación
y asociación. Valores inmutables: paso de
parámetros por valor.
Objetos con estado: los atributos.

Unidad: Clases & Unidad: Función.


Objetos.
¿Qué es la programación funcional?
Definiciones

En la programación orientada a objetos el


razonamiento sobre el código se vuelve complejo
rápidamente.
Motivación
En la programación funcional podemos escribir
programas con menos código, mas expresivos,
obtener y razonar fácilmente sobre
lo que está escrito.
Java vs. Funcional (organización)

Java Clases

FP Funciones

Ms. Freddy Infantes Quiroz


Java vs. Funcional (Algoritmos)

Imperativo, comportamiento
Java Clases
como una serie de pasos

Declarativo, interacción de fun-


FP Funciones
ciones sin especificar su contenido

Ms. Freddy Infantes Quiroz


Java vs. Funcional (Mutabilidad y estado)

Imperativo,
Estado
OOP + yPatrones
comportamiento
comportamiento
para abs-
Java Clases
juntos,
como una
promueve
serie
tracciones de demutabilidad
pasos
alto nivel

Declarativo,
Es una abstracción
Evita interacción
endealto
estado, pro- fun-
FP Funciones
ciones nivel
sin especificar
mueve por si mismo
su contenido
inmutabilidad

Ms. Freddy Infantes Quiroz


Java vs. Funcional (Estilo)

Imperativo,
OOP comportamiento
+ Patrones para abs-
Java Clases
como una serie
tracciones de de
altopasos
nivel

Declarativo,
Es una abstracción
interacción
endealto
fun-
FP Funciones
ciones nivel
sin especificar
por si mismo
su contenido

Ms. Freddy Infantes Quiroz


Java vs. Funcional (Concurrencia)

Imperativo,
Concurrencia
OOP comportamiento
+ Patronesbasica
paracon
abs-
Java Clases
locks
como yuna
recursos
serie
tracciones de compartidos
de
altopasos
nivel

Workflows
Declarativo, paralelosensin
Es una abstracción
interacción es-
dealto
fun-
FP tadonivel Funciones
compartido (no locks!)
ciones sin especificar
por si mismo
su contenido

Ms. Freddy Infantes Quiroz


Java vs. Funcional (Código)

Imperativo,
Concurrencia
OOP comportamiento
+ Patronesbasica
paracon
abs-
Java Descriptivo (demasiado)
Clases
locks
como yuna
recursos
serie
tracciones de compartidos
de
altopasos
nivel

Workflows
Declarativo, paralelosensin
Es una abstracción
interacción es-
dealto
fun-
FP Conciso y denso
Funciones
tadonivel
ciones compartido
sin especificar(no
por si mismo locks!)
su contenido

Ms. Freddy Infantes Quiroz


¿Porque programación funcional?
• Paralelismo
• Multicore, multicpu
• Elegancia

• Java no es un lenguaje funcional puro (Clojure)


• Otras opciones JVM (Scala, Kotlin, Ceylon)
• Java soporta programación funcional a través de bibliotecas

Ms. Freddy Infantes Quiroz


Bloques funcionales en Java 8
• Interfaces funcionales
• Referencia a funciones
• Lambdas
• Funciones predefinidas en Java 8 (java.util.function)
• Streams API

Ms. Freddy Infantes Quiroz


Ejemplo Imperativo

Ejemplo Funcional
18

Java Función Lambda


• item
Función anónima
• Alonzo Church • (String name)
params
• item -> item+1 • (name, age)
• System.out::println •()

-> • Flecha (arrow)

• Class::method (i->)
Es una función anónima, básicamente es un método abstracto es
• object::method (i->)
decir un método que sólo está definido en una interfaz pero no
implementado, y esa es la clave de la funciones lambda, al no estar
body • expression (return)
implementado, el programador lo puede implementar dónde el • {exp; return exp;}
crea conveniente sin haber heredado de la interfaz
19

Java Función Lambda


Consumer<T> accept(T)
• System.out::println (item->)

Function<T,R> apply(T):R
• item -> item +1

Predicate<T> test(T):boolean
• item -> item > 0

Supplier<T> get(): T
• ()-> "..."

BiConsumer<T,U,R> apply(T,U):R
• (msg1, msg2) -> System.out.println(msg1 + "," + msg2)

BiFunction<T,U,R> accept(T,U):R
• (x, y) -> x + y

BiPredicate<T,U,R> apply(T,U):R
• String::equals

...
Expresiones Lambda (1)

• Expresiones Lambda
⚫ Compuesta por dos elementos, separados por una flecha→
● Izquierda flecha parámetros

● Derecha flecha expresión

⚫ Es un función anónima

• Ejemplo
Expresiones Lambda (2)

• Parte izquierda de la flecha


● Parámetros
● Pueden tener 0, 1 o varios.

● Ejemplo:
● 1 parámetro (n)
Expresiones Lambda (3)

• Parte derecha de la flecha →


⚫ Expresión Lambda a ejecutar.
⚫ Devuelve lo que devuelve la operación.
⚫ Permite ejecutar código
● Ejemplo, hacer un System.out.println

⚫ Ejemplo:
● Procesa n > 10

● Devuelve true o false por cada elemento


Expresiones Lambda en ejemplo

• filter(num → num > 10)


• A la izquierda de →
- Son los parámetros (en este caso 1, llamado n)
⚫ A la derecha de →

- Operación a realizar
- Se ejecutara tantas veces como elementos hay.
Streams

• Es una secuencia (flujo) de elementos de una fuente .


• El origen de los elementos se refiere a una colección
o matriz que proporciona datos a la secuencia (flujo)
• No almacena elementos.
• Simplemente transmite elementos de una fuente,
como un canal de E / S, a través de una tubería de
operaciones computacionales.
20

Java
Collection & Stream Stream
in .parallel()

• Gestión bucle
• Método de Función de
Collection transformación transformacion
• Paralelismo
[a, b, c…]
• ¿Reutilización
del código?
Stream
out
Streams

Streams
⚫ Un conjunto de funciones que se ejecutan de forma anidada

⚫ No es una estructura de datos, pero puede modificar datos

⚫ Se inicia creando el flujo con “stream”

⚫ Ejemplo:
Streams
• Funcionamiento
⚫ Flujo de funciones, donde el resultado de una es la entrada de la siguiente.

⚫ Existen las operaciones creación, intermedias y terminales.


● Creación: creación de streams
● Intermedias: generan streams donde se pueden aplicar nuevas funciones.
● Terminales: procesan un resultado sobre un stream

Ms. Freddy Infantes Quiroz


Java 21

Stream. Crear y coleccionar

list.stream();
IntStream.range();
Stream.of("1", "2"...);
Stream.generate();
Stream.iterate();

.collect(Collectors.toList())
.toArray(Integer::new)

[a, b, c]
Streams: Operaciones de Transmisión
• Operaciones Intermedias con Streams:
• filter()
• map()
• flatMap()
• distinct()
• sorted()
• peek()
• limit()
• skip()

Ms. Freddy Infantes Quiroz


22

Java
Stream. Filtrado

.filter(Predicate) .distinct()

.skip(long)
.peek() //debugging
.limit(long)
Java 23

Stream. Transformación

.map(Function) .mapFlat(Function)

.sorted(Comparator);
.mapToInt(…);
Streams: Operaciones de Transmisión
• Operaciones Terminales con Streams:
• forEach()
• forEachOrdered()
• toArray()
• reduce()
• collect()
• min()
• max()
• count()
• anyMatch()
• allMatch()
• noneMatch()
• findFirst()
• findAny()

Ms. Freddy Infantes Quiroz


24
Java
Stream. Operaciones terminales

.findFirst(Predicate)
.reduce(Double::sum) .anyMatch(Predicate)
.reduce(Double::max) .noneMatch(Predicate)
.reduce(Double::min) .allMatch(Predicate)
.reduce(ini,BiFun)
.forEach():void

item
Ejemplo: Streams

• numeros.stream()
⚫ Genera el stream de la lista
• filter( n → n > 10 )
⚫ Filtra dejando solo elementos mayores que 10

• count()
⚫ Filtra dejando un entero con el número de

elementos

También podría gustarte