O que mudou no Java 8: os 5 recursos que modernizaram o Java

O Java 8, lançado em 2014, representou uma das maiores atualizações da linguagem desde sua criação. Ele introduziu conceitos da programação funcional, trouxe APIs mais modernas e possibilitou uma maneira mais elegante e concisa de escrever código.
Neste artigo, destaco os 5 recursos mais importantes dessa versão — com exemplos e comentários — para quem quer entender por que o Java 8 é tão relevante até hoje.
🔹 1. Expressões Lambda
Lambda expressions permitem representar funções como objetos. Isso reduz a verbosidade do código e facilita muito a programação funcional, especialmente quando lidamos com eventos, callbacks e coleções.
Antes do Java 8:
javaCopyEditbutton.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent e) {
System.out.println("Clique!");
}
});
Com Java 8 (Lambda):
javaCopyEditbutton.setOnAction(e -> System.out.println("Clique!"));
💡 Comentário: O código fica mais limpo e direto ao ponto. Você define apenas o que interessa: a ação que será executada. Nada de classes anônimas gigantes só para um pequeno comportamento.
🔹 2. Streams API
A Streams API (java.util.stream
) trouxe uma forma declarativa de processar coleções. É como montar um "pipeline" de operações sobre dados, com foco em leitura, filtragem, transformação e coleta.
Exemplo simples:
javaCopyEditList<String> nomes = Arrays.asList("Ana", "Bruno", "Carlos");
nomes.stream()
.filter(n -> n.startsWith("B"))
.map(String::toUpperCase)
.forEach(System.out::println);
🎯 Comentário: Aqui estamos criando uma sequência de operações encadeadas: filtrando nomes que começam com "B", convertendo para maiúsculas e imprimindo. A API é poderosa, e o código, muito legível.
🔹 3. Optional
Quantas vezes você já se deparou com NullPointerException
? O Optional<T>
ajuda a evitar isso ao expressar de forma clara que um valor pode ou não estar presente.
Exemplo com Optional:
javaCopyEditOptional<String> nome = Optional.ofNullable(getNome());
nome.ifPresent(n -> System.out.println(n.toUpperCase()));
🚫 Comentário: Nada de if (obj != null) {...}
espalhados pelo código. O uso de Optional
nos força a tratar a ausência de valores de maneira explícita, melhorando a legibilidade e reduzindo erros.
🔹 4. Default Methods em Interfaces
Antes do Java 8, qualquer método adicionado a uma interface quebrava todas as implementações existentes. Agora, com default
, podemos fornecer implementações diretamente na interface.
Exemplo:
javaCopyEditinterface Logavel {
default void log(String mensagem) {
System.out.println("[LOG] " + mensagem);
}
}
🧩 Comentário: Esse recurso permitiu evoluir APIs sem prejudicar o código legado. Além disso, pode servir como forma de reutilização simples de comportamento entre classes.
🔹 5. Nova API de Data e Hora
A antiga java.util.Date
era notoriamente confusa e mutável. O Java 8 trouxe uma nova API baseada no Joda-Time, mais robusta, imutável e fácil de usar: java.time
.
Exemplo moderno:
javaCopyEditLocalDate hoje = LocalDate.now();
LocalDate vencimento = hoje.plusDays(10);
System.out.println("Data de vencimento: " + vencimento);
📅 Comentário: Datas e horários agora são tratados com clareza. Além de LocalDate
, temos LocalTime
, ZonedDateTime
, Period
, Duration
, entre outras classes úteis.
✅ Conclusão
O Java 8 modernizou a linguagem com recursos que continuam sendo a base de muitos projetos até hoje. Lambdas, Streams e Optional, por exemplo, viraram parte essencial do dia a dia dos desenvolvedores Java.
Se você ainda está preso à forma antiga de programar, vale muito a pena explorar essas funcionalidades.
🔜 Próximo post: Vou mostrar as mudanças no Java 9 — incluindo o sistema de módulos (JPMS) e o REPL interativo do JShell.
#java
#java8
#programacao
#backend
#streams
#lambda
#optional
#javafunctional
#hashnode
Subscribe to my newsletter
Read articles from Wagner Barbosa directly inside your inbox. Subscribe to the newsletter, and don't miss out.
Written by
