Java Avanzado Clase 12
Java Avanzado Clase 12
Java Avanzado Clase 12
Clase 12
Programación Funcional
Les damos la bienvenida
Vamos a comenzar a grabar la clase
Clase 12 Clase 13
En los lenguajes estrictamente funcionales no hay tipos de datos. En Java no vamos a tener
exactamente lo mismo, pero por medio de las expresiones lambda vamos a poder hacer uso de la
inferencia de tipos o más bien dentro de las expresiones lambda vamos a poder prescindir de
declarar los tipos de datos y vamos a dejar ese trabajo al compilador por medio de la inferencia de
tipos.
Para lograr todo esto Java ha incorporado nuevas características como las expresiones lambda,
métodos referenciados y las interfaces funcionales.
- Conocer cuántos números mayores a 10 hay en la Lista
int contador = 0;
// Imperativo
Long resultado = numeros.stream().filter(num -> num > 10).count():
System.out.println(resultado);
Como podemos observar con la programación funcional las líneas de código se reducen y nuestro
código se muestra más legible.
// Clase principal
public class lambdaFunction {
// Se declara la interface
interface operacion {
// el metodo abstracto
public double suma(double x, double y);
}
}
INTERFACES FUNCIONALES
Una interfaz funcional es aquella que solo tiene un método abstracto, podemos utilizar métodos
default, métodos estáticos y métodos heredados de la clase object y declararlos como métodos
abstractos.
// Clase principal
public class lambdaFunction {
// Anotacion para declara la interface
@FunctionalInterface
interface operacion {
// el metodo abstracto
public double suma(double x, double y);
}
public static void main(String[] args) {
// Expresion lambda
operacion l = (x, y) -> x + y;
System.out.println(l.suma(8, 30));
} }
Si la interfaz que estamos declarando contiene la Anotación @FunctionalInterface y esta no cumple con
los criterios para que sea una interfaz funcional nos dará un error de compilación, esto nos ayuda
y es una buena práctica para desarrollar correctamente. Cabe mencionar que una interfaz con un
solo método abstracto como lo hemos comentado sigue siendo una interfaz funcional aunque no
tenga la Anotación @FunctionalInterface.
Métodos referenciados
Hasta ahora lo que sabemos y conocemos de la programación funcional es que las expresiones
lambda sirven para reemplazar los métodos anónimos en el caso de las interfaces funcionales.
Algunas veces sin embargo una expresión lambda no hace otra cosa más que llamar a un método
que ya existe, en estos casos podría ser más claro referirnos al método que ya existe por su
nombre.
Los métodos referenciados nos permiten referirnos a los métodos que ya existen mediante su
nombre.
import java.util.function.Consumer;
}
¿QUÉ SON LOS STREAMS?
Podríamos decir que los Streams son "envoltorios" de colecciones de datos que nos
permiten operar con estas colecciones y hacer que el procesamiento masivo de datos sea
rápido y fácil de leer. Algo importante a tener en cuenta es que los Streams no almacenan
datos y no son una estructura de datos en sí. Tampoco modifican la fuente de datos
subyacente. Solo realizan operaciones simples o concatenadas sobre ellos.
Los Streams en java son un nuevo modelo de datos que nos permite tratar las colecciones como si de etapas
de un proceso ETL (“Extract Transform and Load”) se tratara. Esto nos permite utilizar las funciones Map
y Reduce tan comunes en esos procesos, especialmente en la etapa de transformación.
En java 8, toda colección tiene un método stream() que transformará dicha estructura en Stream. Por
ejemplo vamos a crear una instancia llamada “streangs” de Stream de Strings.
// Con esto obtendríamos una única cadena concatenando todos sus elementos
Filter: Filtra los elementos que satisfagan una determinada condición: streangs.filter(s -> s.length() > 5); // Solo
mantenemos cadenas de longitud mayor a 5
Collect: El paso final de la transformación del Stream, nos permitirá por ejemplo volverlo a convertir a una lista
estándar.
Salvo los métodos finales como son collect, reduce o forEach todos se pueden ir encadenando como si fueran tuberías,
creando un proceso de transformación más complejo./ Obtenemos las cadenas ordenadas que representen números pares
List<String> even = strings.stream()
.map(string -> Integer.valueOf(s))
.filter(integer -> integer % 2 == 0)
.distinct()
.sorted()
.map(integer::toString)
.collect(Collectors.toList());
A modo de conclusión, podemos decir que con estos streams tenemos una nueva manera de procesar colecciones de datos
respecto a las tradicionales sentencias de control como pueden ser bucles y condiciones. Además, también nos proporcionan
la ventaja de poder “exprimir” más a los procesadores, utilizando para ello los parallelStream, que utilizan varios hilos de
ejecución en cada etapa de procesamiento.
Recordá:
● Revisar la Cartelera de Novedades.
● Hacer tus consultas en el Foro.