← SEARCHABLE ARCHIVE
Java · 2026-08-03

Java de los fundamentos al dominio — Lección 6

Crear flujos de datos con Lambda, Stream y Opcional

INTERACTIVE READING MODE →

Los artículos escritos en este blog fueron creados con el objetivo de enseñar. Además, la información del artículo puede ser incorrecta, así que tenga cuidado.

Con frecuencia aparece código que selecciona, convierte y combina valores que cumplen las condiciones en una colección. Lambda y Stream expresan las etapas por las que pasan los datos a través de un flujo de operaciones.

lambda

Predicate<Monster> isAlive = monster -> monster.getHealth() > 0;
Function<Monster, String> getName = Monster::getName;

Lambdas permiten pasar acciones como valores. Las referencias a métodos son concisas cuando se utiliza un método existente en el mismo formato de función.

Tubería de flujo

List<String> targetNames = monsters.stream()
    .filter(Monster::isAlive)
    .sorted(Comparator.comparingInt(Monster::getHealth))
    .limit(3)
    .map(Monster::getName)
    .toList();

El flujo consiste en clasificar los monstruos vivos en orden de fuerza física y obtener tres nombres. Las operaciones intermedias generalmente se ejecutan cuando se llama a la operación final.

Una vez que se consume una transmisión, la misma transmisión no se puede volver a utilizar. Debe consultar repetidamente la colección original o almacenar los resultados como una lista.

Optional

Optional<Item> item = repository.find(10);

String name = item
    .map(Item::getName)
    .orElse("Unknown");

Opcional indica al tipo de retorno que el valor puede estar presente o no. Si llama a get() directamente, no se perderá ningún procesamiento nuevamente, así que use operaciones como orElse, map e ifPresent.

Opcional se usa a menudo para expresar la ausencia de un valor de retorno en lugar de usarlo para todos los campos y parámetros.

Rendimiento y legibilidad

Las secuencias no siempre son más rápidas que los bucles y pueden generar pequeños objetos de operación y listas de resultados. Es mejor comenzar con un flujo fácil de leer y luego cambiar sólo los caminos repetitivos que causan problemas en las mediciones reales a bucles simples.

El propósito de lambdas y streams no es hacer que el código sea lo más corto posible. El objetivo es hacer que los pasos del procesamiento de datos, como el filtrado, la transformación y la clasificación, sean legibles sin efectos secundarios.