Vavr para Java: Guía completa de programación funcional
1. ¿Qué es Vavr y por qué usarla?
Vavr (anteriormente conocida como Javaslang) es una potente librería de programación funcional para Java que ofrece colecciones inmutables, estructuras de datos funcionales y utilidades para trabajar con funciones de orden superior. A diferencia del Java Collections Framework estándar, Vavr prioriza la inmutabilidad y la expresividad del código, permitiendo escribir programas más predecibles, seguros para hilos y concisos.
¿Por qué usar Vavr? Aunque Java moderno (desde la versión 8) incluye expresiones lambda y Stream API, las colecciones estándar siguen siendo mutables. Esto genera efectos secundarios, complicaciones en programación concurrente y la necesidad de escribir mucho código repetitivo. Vavr resuelve estos problemas ofreciendo:
- Colecciones inmutables (List, Set, Map) con una API enriquecida, similar a Scala o Kotlin.
- Tipos Option, Try, Either, Validation para manejar de forma segura valores nulos, excepciones y errores sin bloques try-catch.
- Tuplas (Tuple) para agrupar valores de diferentes tipos sin necesidad de crear DTOs.
- Interfaces funcionales (FunctionN, CheckedFunction) con composición, memoización y aplicación parcial.
- Cálculos perezosos (Lazy) y Pattern Matching.
Vavr es especialmente útil en proyectos que requieren alta fiabilidad (sistemas financieros, procesamiento de datos), concurrencia (la inmutabilidad simplifica el paralelismo) o simplemente el deseo de escribir código más declarativo y limpio. No reemplaza a Java estándar, sino que lo complementa, permitiendo elegir la herramienta adecuada para cada tarea.
2. Instalación
Vavr se distribuye a través de Maven Central. Para añadirla a tu proyecto, usa uno de estos sistemas de compilación:
Maven
<dependency>
<groupId>io.vavr</groupId>
<artifactId>vavr</artifactId>
<version>0.10.4</version>
</dependency>
Gradle
implementation 'io.vavr:vavr:0.10.4'
Gradle (Kotlin DSL)
implementation("io.vavr:vavr:0.10.4")
Para el sistema de módulos de Java 9+, añade en module-info.java:
requires vavr;
La versión actual al escribir este artículo es la 0.10.4 (publicada en 2019, pero estable y ampliamente utilizada). Puedes verificar la última versión en MVNRepository.
3. Inicio rápido — ejemplo mínimo funcional
Crea la clase VavrDemo.java y ejecútala:
import io.vavr.collection.List;
import io.vavr.control.Option;
public class VavrDemo {
public static void main(String[] args) {
// Creamos una lista inmutable
List<Integer> numbers = List.of(1, 2, 3, 4, 5);
// Transformación funcional
List<Integer> doubled = numbers
.filter(n -> n % 2 == 0) // pares
.map(n -> n * 2); // duplicar
System.out.println(doubled); // List(4, 8)
// Option en lugar de Optional
Option<String> maybeName = Option.of("Ana");
String greeting = maybeName
.map(name -> "Hola, " + name)
.getOrElse("Hola, desconocido");
System.out.println(greeting); // Hola, Ana
}
}
Este ejemplo muestra dos capacidades clave: colecciones inmutables con encadenamiento de métodos y manejo seguro de nulos mediante Option.