Las expresiones lambda en Java te permiten pasar funciones como argumentos a métodos o construir instancias de interfaces funcionales de forma concisa y elegante.
Una expresión lambda tiene la siguiente sintaxis básica:
(parametros) -> { cuerpo de la expresion lambda }
parametros
: Los parámetros de la función.cuerpo de la expresion lambda
: El cuerpo de la función.
public class LambdaEjemplo {
public static void main(String[] args) {
// Expresión lambda que suma dos números
Operacion suma = (a, b) -> a + b;
// Llamada a la expresión lambda
int resultado = suma.operar(5, 3);
System.out.println("Resultado de la suma: " + resultado);
}
}
// Interfaz funcional
interface Operacion {
int operar(int a, int b);
}
En este ejemplo:
Operacion
.Una interfaz funcional en Java es una interfaz que contiene un único método abstracto. Se utilizan principalmente para implementar expresiones lambda y referencias a métodos.
@FunctionalInterface
public interface MiInterfazFuncional {
void miMetodo(); // Método abstracto
}
@FunctionalInterface
: Es una anotación opcional que indica que la interfaz es funcional. No es obligatoria, pero es una buena práctica usarla para evitar agregar accidentalmente métodos abstractos adicionales.
public class InterfazFuncionalEjemplo {
public static void main(String[] args) {
// Implementación de la interfaz funcional mediante una expresión lambda
MiInterfazFuncional miFuncion = () -> {
System.out.println("Hola desde mi método funcional");
};
// Llamada al método de la interfaz funcional
miFuncion.miMetodo();
}
}
En este ejemplo, MiInterfazFuncional
es una interfaz funcional con un único método abstracto miMetodo()
. Se implementa utilizando una expresión lambda.
La Streams API en Java proporciona una forma elegante y funcional de procesar colecciones de datos de manera eficiente.
Los streams representan una secuencia de elementos y proporcionan operaciones para realizar transformaciones en estos elementos de forma declarativa.
Puedes crear streams a partir de colecciones, arrays o directamente.
import java.util.Arrays;
import java.util.List;
import java.util.stream.Stream;
public class StreamsEjemplo {
public static void main(String[] args) {
// Creación de un stream a partir de una lista
List lista = Arrays.asList("uno", "dos", "tres");
Stream streamDeLista = lista.stream();
// Creación de un stream a partir de un array
String[] array = {"cuatro", "cinco", "seis"};
Stream streamDeArray = Arrays.stream(array);
// Creación de un stream directamente
Stream numerosStream = Stream.of(1, 2, 3, 4, 5);
}
}
Puedes realizar diversas operaciones sobre streams, como filtrado, mapeo, reducción, etc.
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
public class StreamsOperaciones {
public static void main(String[] args) {
List lista = Arrays.asList("uno", "dos", "tres", "cuatro", "cinco");
// Filtrado
List filtrados = lista.stream()
.filter(s -> s.startsWith("c"))
.collect(Collectors.toList());
// Mapeo
List longitudes = lista.stream()
.map(String::length)
.collect(Collectors.toList());
// Reducción
int suma = lista.stream()
.mapToInt(String::length)
.sum();
}
}