Prévia do material em texto
Classes Anônimas, Classes Funcionais e
Expressões Lambda em Java
Introdução às Classes Anônimas, Classes Funcionais e
Expressões Lambda
A linguagem Java, amplamente conhecida por sua forte orientação a objetos, passou por
diversas atualizações que visam melhorar a eficiência do código e sua legibilidade. Com o
surgimento do Java 8, novos recursos foram introduzidos, entre eles as expressões
lambda e o suporte mais robusto para interfaces funcionais. Esses novos recursos trazem
uma alternativa mais concisa e funcional às classes anônimas, que por muito tempo foram
a principal maneira de implementar rapidamente classes em tempo de execução.
Conceitos Básicos
● Classes Anônimas: São classes internas declaradas e instanciadas ao mesmo
tempo, sem precisar de um nome específico. Elas são usadas principalmente
quando precisamos de uma única instância de uma classe que geralmente
implementa uma interface ou estende outra classe. As classes anônimas permitem
instanciar classes no local em que são necessárias, geralmente para implementar
interfaces ou sobrecarregar métodos de forma rápida e pontual.
● Expressões Lambda: Introduzidas no Java 8, as expressões lambda são uma
maneira mais compacta de implementar interfaces funcionais. Elas permitem
escrever métodos inline, o que melhora a legibilidade e a concisão do código,
especialmente quando comparadas às classes anônimas.
● Interfaces Funcionais: Uma interface funcional é uma interface que contém apenas
um método abstrato. O conceito é importante porque as expressões lambda só
podem ser usadas para implementar interfaces funcionais. A introdução das
expressões lambda trouxe consigo uma série de interfaces funcionais predefinidas
no pacote java.util.function.
Motivação para o Uso
O motivo principal para o uso de expressões lambda e classes anônimas está na
simplificação do código, eliminando a necessidade de definir classes completas quando
tudo o que precisamos é de uma implementação rápida de uma interface ou classe
abstrata. O uso dessas estruturas aumenta a produtividade do desenvolvedor e torna o
código mais fácil de ler e manter, além de reduzir a repetição de código boilerplate.
Java
Java
Classes Anônimas
Sintaxe e Estrutura
As classes anônimas são comumente usadas em situações onde precisamos criar uma
implementação rápida de uma interface ou estender uma classe sem precisar declarar uma
nova classe. Sua sintaxe consiste em definir uma classe dentro de uma expressão, seguida
pela implementação de seus métodos no local. Vejamos um exemplo comum com o uso de
ActionListener em uma interface gráfica (Swing):
Button button = new Button("Clique aqui");
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("Botão clicado");
}
});
Nesse exemplo, criamos uma implementação anônima da interface ActionListener
diretamente no local onde ela é necessária. Essa abordagem evita a necessidade de criar
uma nova classe explícita que implemente ActionListener.
Utilização Prática
As classes anônimas são amplamente utilizadas em diversos contextos no Java, incluindo:
● Eventos de Interface Gráfica: As classes anônimas são frequentemente usadas
para manipular eventos, como cliques de botão ou interações com o teclado.
● Tarefas Assíncronas: Ao implementar a interface Runnable, podemos criar
rapidamente tarefas em segundo plano utilizando classes anônimas, sem a
necessidade de criar uma nova classe separada.
Exemplo prático com Runnable:
Thread thread = new Thread(new Runnable() {
@Override
Java
public void run() {
System.out.println("Thread executando...");
}
});
thread.start();
Limitações e Desvantagens
Apesar de práticas, as classes anônimas podem resultar em código menos legível,
especialmente quando as implementações são complexas. Outra desvantagem é que, por
serem uma forma de classe interna, podem aumentar o acoplamento entre as classes,
tornando o código menos modular e mais difícil de manter. Além disso, o código com
classes anônimas tende a ser mais verboso quando comparado às expressões lambda,
especialmente quando se trata de interfaces funcionais.
Expressões Lambda
Sintaxe e Estrutura
As expressões lambda, introduzidas no Java 8, são uma evolução natural das classes
anônimas, permitindo que funções sejam tratadas como objetos de primeira classe. A
sintaxe básica de uma expressão lambda é composta de uma lista de parâmetros, a seta ->
e o corpo da função.
Exemplo simples de uma expressão lambda:
Button button = new Button("Clique aqui");
button.addActionListener(e -> System.out.println("Botão clicado"));
Nesse exemplo, eliminamos a necessidade de criar uma classe anônima, substituindo-a por
uma expressão lambda que implementa o método actionPerformed.
Java
Java
Interfaces Funcionais
Uma interface funcional contém um único método abstrato e é a base para o uso de
expressões lambda. Alguns exemplos de interfaces funcionais padrão do Java são:
● Runnable – Para execução de código em threads.
● Callable – Semelhante a Runnable, mas permite o retorno de um valor.
● Comparator – Usada para definir a lógica de ordenação de coleções.
Exemplo de uso de Comparator com lambda:
List lista = Arrays.asList("Beto", "Ana", "Carlos");
lista.sort((s1, s2) -> s1.compareTo(s2));
Aplicação Prática
As expressões lambda são especialmente úteis em operações com Streams e coleções.
Elas permitem simplificar operações como filtragem, mapeamento e iteração de forma clara
e concisa.
Exemplo com Streams:
List nomes = Arrays.asList("Ana", "Beto", "Carlos");
nomes.stream()
.filter(nome -> nome.startsWith("A"))
.forEach(System.out::println);
Vantagens
As expressões lambda tornam o código mais limpo e legível. Elas também permitem um
estilo de programação mais funcional, onde o foco está no "o que fazer" em vez de "como
fazer". Além disso, reduzem a necessidade de boilerplate, tornando o código mais fácil de
manter e expandir.
Java
Comparação entre Classes Anônimas e Expressões
Lambda
Quando Usar Cada Estrutura?
As classes anônimas ainda são úteis em situações onde mais de um método precisa ser
implementado ou quando a implementação é complexa e envolve mais do que apenas o
comportamento de uma interface funcional. Por outro lado, as expressões lambda são
ideais para interfaces funcionais simples, como Runnable ou ActionListener.
Impacto na Legibilidade do Código
Ao comparar os dois, as expressões lambda frequentemente resultam em código mais
conciso e legível, especialmente em casos simples. A principal desvantagem das classes
anônimas é a verbosidade, que pode obscurecer o propósito real do código.
Classes Funcionais
Conceito de Interface Funcional
Uma interface funcional contém exatamente um método abstrato. A adição de anotações
como @FunctionalInterface garante que a interface não terá mais de um método
abstrato, evitando erros.
Biblioteca de Interfaces Funcionais (java.util.function)
O pacote java.util.function oferece uma série de interfaces funcionais pré-definidas,
como:
● Predicate: Avalia uma condição e retorna um boolean.
● Function: Aplica uma função e retorna um valor.
● Consumer: Consome um objeto sem retornar resultado.
Exemplo de Predicate:
Predicate isEven = n -> n % 2 == 0;
System.out.println(isEven.test(4)); // true
Conclusão
O uso de classes anônimas, expressões lambda e interfaces funcionais é uma adição
valiosa ao ecossistema Java, especialmente no que diz respeito à legibilidade e eficiência
do código. As expressões lambda, em particular, oferecem uma maneira poderosa de
programar de forma funcional, facilitando o trabalho com coleções e operações paralelas.
As classes anônimas, embora ainda úteis, tendem a ser substituídas pelas lambdas, exceto
em casos onde múltiplos métodos precisam ser implementados.
Referências Bibliográficas
● Oracle. Interfaces Funcionais em Java 8. Disponível em:
https://docs.oracle.com/javase/8/docs/api/java/util/function/package-summary.html.
● Oracle. ExpressõesLambda em Java. Disponível em:
https://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html
● Baeldung. Expressões Lambda no Java 8: Um Tutorial. Disponível em:
https://www.baeldung.com/java-8-lambda-expressions-tips
● GeeksforGeeks. Expressões Lambda no Java 8. Disponível em:
https://www.geeksforgeeks.org/lambda-expressions-java-8/
● Deitel, H. M., Deitel, P. J. Java: Como Programar. 10ª ed. São Paulo: Pearson, 2016.
Disponível em:
https://www.pearson.com.br/livros/java-como-programar-deitel-deitel-10ed
● Sedgewick, R., Wayne, K. Algoritmos em Java. 4ª ed. Rio de Janeiro: Alta Books,
2014. Disponível em:
https://www.altabooks.com.br/produto/algoritmos-em-java-4a-edicao
● Oracle. Expressões Lambda em Java: O Que São e Como Funcionam. Disponível
em: https://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html
● DevMedia. Introdução às Expressões Lambda no Java 8. Disponível em:
https://www.devmedia.com.br/introducao-as-expressoes-lambda-no-java-8/31268
● Java Magazine. Expressões Lambda e Programação Funcional no Java 8.
Disponível em:
https://www.oracle.com/br/technical-resources/articles/java/architect-lambdas-part1.h
tml
● Baeldung. Interfaces Funcionais e Expressões Lambda no Java 8. Disponível em:
https://www.baeldung.com/java-8-functional-interfaces
https://docs.oracle.com/javase/8/docs/api/java/util/function/package-summary.html
https://docs.oracle.com/javase/8/docs/api/java/util/function/package-summary.html
https://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html
https://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html
https://www.baeldung.com/java-8-lambda-expressions-tips
https://www.geeksforgeeks.org/lambda-expressions-java-8/
https://www.pearson.com.br/livros/java-como-programar-deitel-deitel-10ed
https://www.altabooks.com.br/produto/algoritmos-em-java-4a-edicao
https://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html
https://www.devmedia.com.br/introducao-as-expressoes-lambda-no-java-8/31268
https://www.oracle.com/br/technical-resources/articles/java/architect-lambdas-part1.html
https://www.oracle.com/br/technical-resources/articles/java/architect-lambdas-part1.html
https://www.oracle.com/br/technical-resources/articles/java/architect-lambdas-part1.html
https://www.baeldung.com/java-8-functional-interfaces