No Java 8, interfaces funcionais são aquelas que possuem apenas um método abstrato. Elas podem ser instanciadas usando expressões lambda, facilitando a programação funcional e tornando o código mais conciso e legível.
🔹 Exemplo 1: Uso de Consumer
A interface Consumer possui um único método abstrato (accept(T t)), permitindo que seja usada com expressões lambda:
//Consumer<T>: Usado para consumir um valor sem retornar nada, como imprimir valores:
Consumer<String> print = System.out::println;
List<String> usuarios = List.of("Alice", "Bob", "Charlie");
usuarios.forEach(print::accept);
Caso a interface tivesse mais de um método abstrato, o compilador não conseguiria inferir automaticamente qual método implementar.
🔹 Exemplo 2: Uso de Runnable (Pré e Pós-Java 8)
Antes do Java 8, ao criar uma Thread, a interface Runnable era instanciada da seguinte forma:
Runnable r = new Runnable() {
public void run() {
for (int i = 0; i <= 1000; i++) {
System.out.println(i);
}
}
};
new Thread(r).start();
Com expressões lambda, o código fica mais enxuto:
Runnable r = () -> {
for (int i = 0; i <= 1000; i++) {
System.out.println(i);
}
};
new Thread(r).start();
Ou ainda mais simplificado:
new Thread(() -> {
for (int i = 0; i <= 1000; i++) {
System.out.println(i);
}
}).start();
🔹 O Pacote java.util.function
O Java 8 introduziu o pacote java.util.function, que contém várias interfaces funcionais reutilizáveis, como:
Consumer – executa uma ação com um argumento.
Function – transforma um tipo em outro.
Supplier – fornece um valor sem argumento.
Predicate – retorna um booleano com base em uma condição.
No decorrer do estudo, mais dessas interfaces serão exploradas. 🚀
Top comments (0)