
- Ejemplo 1: (x) -> x * 2
- Ejemplo 2: (nombre) -> { return "Hola, " + nombre; }
- Ejemplo 3: (numeros) -> { int suma = 0;
for (int num : numeros) {
suma += num; }
return suma; }
- Ejemplo 4: () -> System.out.println("Hola, mundo!")
- Ejemplo 5: (a, b, c) -> a * b + c
- Ejemplo 6: (texto) -> "¡Hola " + texto + "!"
- Ejemplo 7: (array) -> { int max = array[0];
for (int num : array) {
if (num > max) max = num;}
return max; Function<String, Integer> parser = Integer::parseInt;String str = "ejemplo";
Supplier<Integer> lengthSupplier = str::length;Function<String, String> upperCase = String::toUpperCase;Supplier<List<String>> listSupplier = ArrayList::new;ClassOrInstance::methodName:: es el operador de referencia a método@FunctionalInterface (opcional pero recomendado)java.util.functionjava.util.function:@FunctionalInterface
interface Calculadora {
int operacion(int a, int b);
}
public class Test {
public static void main(String[] args) {
Calculadora suma = (x, y) -> x + y;
Calculadora resta = (x, y) -> x - y;
System.out.println(suma.operacion(5, 3)); // 8
System.out.println(resta.operacion(5, 3)); // 2
}
}Collection (List, Set, Queue, etc.) puede generar un Stream:Predicate esCaro = p -> p.getPrecio() > 100;
Predicate esElectronica = p -> p.getCategoria().equals("Electrónica");
Predicate filtroCompuesto = esCaro.and(esElectronica);
List resultado = productos.stream()
.filter(filtroCompuesto)
.collect(Collectors.toList());
// Sumar todos los números
int suma = numeros.stream().reduce(0, (a, b) -> a + b);
// O usando método de referencia
int suma = numeros.stream().reduce(0, Integer::sum);
// Multiplicar todos los números
int producto = numeros.stream().reduce(1, (a, b) -> a * b);
// Encontrar el precio total
BigDecimal total = productos.stream().map(Producto::getPrecio) .reduce(BigDecimal.ZERO, BigDecimal::add);
List lista = stream.collect(Collectors.toList());
Map mapa = personas.stream().collect(Collectors.toMap(Persona::getId, Persona::getNombre));
Map porDepartamento = empleados.stream().collect(Collectors.groupingBy(
Empleado::getDepartamento));
Map porSalario =empleados.stream().collect(Collectors.partitioningBy(
e -> e.getSalario() > 30000));
DoubleSummaryStatistics stats =
productos.stream()
.collect(Collectors.summarizingDouble(Producto::getPrecio));
// stats.getAverage(), getCount(),
// getMax(), getMin(), getSum()
Optional resultado = personas.stream()
.filter(p -> p.getEdad() > 30)
.map(Persona::getEmail)
.filter(email -> email.contains("@"))
.findFirst();
String email = resultado.orElse("Sin email válido");
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.Period;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
public class EjemploCompleto {
public static void main(String[] args) {
// Lista de empleados para procesar
List empleados = Arrays.asList(
new Empleado("Ana", "Desarrollo", LocalDate.of(1985, 5, 21), new BigDecimal("45000")),
new Empleado("Carlos", "Marketing", LocalDate.of(1992, 8, 10), new BigDecimal("38000")),
new Empleado("Elena", "Desarrollo", LocalDate.of(1989, 3, 15), new BigDecimal("47000")),
new Empleado("David", "Ventas", LocalDate.of(1991, 7, 8), new BigDecimal("52000")),
new Empleado("Sofía", "Desarrollo", LocalDate.of(1995, 11, 23), new BigDecimal("41000")),
new Empleado("Miguel", "Marketing", LocalDate.of(1988, 2, 14), new BigDecimal("39500"))
);
// Calcular la edad promedio por departamento
Map edadPromedioPorDepartamento = empleados.stream()
.collect(Collectors.groupingBy(
Empleado::getDepartamento,
Collectors.averagingInt(e ->
Period.between(e.getFechaNacimiento(), LocalDate.now()).getYears())
));
System.out.println("Edad promedio por departamento:");
edadPromedioPorDepartamento.forEach((depto, edad) ->
System.out.printf("%s: %.1f años\n", depto, edad));
// Encontrar el empleado mejor pagado por departamento
Map mejorPagadoPorDepartamento = empleados.stream()
.collect(Collectors.groupingBy(
Empleado::getDepartamento,
Collectors.collectingAndThen(
Collectors.maxBy((e1, e2) ->
e1.getSalario().compareTo(e2.getSalario())),
opcional -> opcional.orElse(null)
)
));
System.out.println("\nEmpleado mejor pagado por departamento:");
mejorPagadoPorDepartamento.forEach((depto, emp) ->
System.out.printf("%s: %s (%s)\n", depto, emp.getNombre(), emp.getSalario()));
// Calcular estadísticas salariales
System.out.println("\nEstadísticas salariales:");
empleados.stream()
.map(Empleado::getSalario)
.mapToDouble(BigDecimal::doubleValue)
.summaryStatistics()
.forEach(stats -> {
System.out.printf("Mínimo: %.2f\n", stats.getMin());
System.out.printf("Máximo: %.2f\n", stats.getMax());
System.out.printf("Promedio: %.2f\n", stats.getAverage());
System.out.printf("Total: %.2f\n", stats.getSum());
});
}
}
class Empleado {
private final String nombre;
private final String departamento;
private final LocalDate fechaNacimiento;
private final BigDecimal salario;
// Constructor, getters y setters...
}




stream.filter(Objects::nonNull)
.map(obj -> Optional.ofNullable(obj.getPropiedad()))
.filter(Optional::isPresent)
.map(Optional::get)
// Incorrecto:
Stream stream = lista.stream();
stream.forEach(System.out::println);
long count = stream.count(); // Error!
// Correcto:
lista.stream().forEach(System.out::println);
long count = lista.stream().count();