Vavr para Java: Guia Completo de Programação Funcional
1. O que é Vavr e por que usá-la?
Vavr (anteriormente conhecida como Javaslang) é uma poderosa biblioteca de programação funcional para Java que oferece coleções imutáveis, estruturas de dados funcionais e utilitários para trabalhar com funções de alta ordem. Diferente do Java Collections Framework padrão, a Vavr prioriza a imutabilidade e a expressividade do código, permitindo escrever programas mais previsíveis, thread-safe e concisos.
Por que usar Vavr? No Java moderno (a partir da versão 8), temos expressões lambda e Stream API, mas as coleções padrão ainda são mutáveis. Isso gera efeitos colaterais, dificuldades em programação concorrente e a necessidade de escrever muito código boilerplate. A Vavr resolve esses problemas oferecendo:
- Coleções imutáveis (List, Set, Map) com uma API rica, similar a Scala ou Kotlin.
- Tipos Option, Try, Either, Validation para tratamento seguro de null, exceções e erros sem blocos try-catch.
- Tuplas (Tuple) para agrupar valores de tipos diferentes sem criar DTOs.
- Interfaces funcionais (FunctionN, CheckedFunction) com composição, memoização e aplicação parcial.
- Computação lazy (Lazy) e Pattern Matching.
A Vavr é especialmente útil em projetos que exigem alta confiabilidade (sistemas financeiros, processamento de dados), concorrência (imutabilidade simplifica o paralelismo) ou simplesmente para quem deseja escrever código mais declarativo e limpo. Ela não substitui o Java padrão, mas o complementa, permitindo escolher a ferramenta certa para cada tarefa.
2. Instalação
A Vavr é distribuída via Maven Central. Para adicioná-la ao seu projeto, use um dos seguintes sistemas de build:
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 o sistema de módulos do Java 9+, adicione em module-info.java:
requires vavr;
A versão atual no momento da escrita deste artigo é a 0.10.4 (lançada em 2019, mas estável e amplamente utilizada). Verifique a versão mais recente em MVNRepository.
3. Primeiros passos — exemplo mínimo funcional
Crie a classe VavrDemo.java e execute-a:
import io.vavr.collection.List;
import io.vavr.control.Option;
public class VavrDemo {
public static void main(String[] args) {
// Criando uma lista imutável
List<Integer> numbers = List.of(1, 2, 3, 4, 5);
// Transformação funcional
List<Integer> doubled = numbers
.filter(n -> n % 2 == 0) // pares
.map(n -> n * 2); // dobrar
System.out.println(doubled); // List(4, 8)
// Option no lugar de Optional
Option<String> maybeName = Option.of("Alice");
String greeting = maybeName
.map(name -> "Olá, " + name)
.getOrElse("Olá, estranho");
System.out.println(greeting); // Olá, Alice
}
}
Este exemplo mostra dois recursos principais: coleções imutáveis com encadeamento de métodos e tratamento seguro de null com Option.
4. Principais métodos, funções e classes
4.1. Option — substituto seguro para Optional
Também na biblioteca
Criptografia em PHP: criptografia e hash (guia prático)
Geração de PDF em TypeScript: bibliotecas, ferramentas e exemplos de código
Cliente OAuth para JavaScript (Node.js): visão geral e exemplos de uso
Cliente HTTP para Kotlin: Principais bibliotecas para trabalhar com rede