Resumo: Interfaces funcionais em Java
- Olá, leitor. Você pode está estranhando uma postagem em português em meio a várias (tentativas) em inglês, isso é devido a uma vontade em relatar minhas experiências em português, já que em inglês o conteúdo é bem mais vasto; e de quebra ainda posso ajudar alguém que tenha mais dificuldade com a língua inglesa.
Se você está aqui, já deve conhecer o Java, suas principais características e o "quanto ela é orientada a objetivos". Eu digo isso porque, na maioria das linguagens de programação você consegue ter algo simples como um "Hello, world" sem ter que criar uma estrutura de "classe" para tal; isso é mais um "feeling" que tenho.
Não passou pela minha cabeça, talvez ingenuidade, que Java poderia ter suporte a programação funcional, mesmo sabendo que ele é multiparadigma; para mim, não combinava ou não era "necessário", mas ainda bem que tem.
Um dos primeiros contato com programação funcional que se tem em Java são com lambdas e "interface funcional". De maneira simples, uma interface funcional é uma interface (sério?) com apenas um método abstrato.
// Eu pessoalmente acho estranha essa abordagem...
interface Funcional {
public abstract void funcao();
}
public class programacao_funcional {
public static void main(String[] args) throws IOException {
excuta_funcao(() -> {
System.out.println("Olá, mundo!");
});
}
public static void excuta_funcao(Funcional funcional) {
funcional.funcao();
}
}
Basicamente um interface como qualquer outra com apenas um método abstrato. A função executa_funcao
recebe essa interface como parâmetro e chama sua única função. No método main
, onde tal função é chamada, o método abstrato é de fato implementado através da notação lambda do Java: () → {}
. Nada tão chato de entender, certo? Agora que vem a parte que me está me fazendo escrever essa postagem/diário.
Interfaces funcionais
O que criamos anteriormente já é uma interface funcional por si, mas o que o título dessa seção quer dizer é: "interfaces nativas do ambiente Java".
Antes de enfrentá-las, devemos conhecê-las. São elas, ao menos as principais:
- Function
- Predicate
- Consumer
- Supplier
Function
Interface Function<T,R>
https://docs.oracle.com/javase/8/docs/api/java/util/function/Function.html
É um das mais simples delas: é uma interface que recebe um valor e retorna outro.
Predicate
Interface Predicate<T>
https://docs.oracle.com/javase/8/docs/api/java/util/function/Predicate.html
Recebe um valor e retorna um boolean
através do método test
.
Consumer
Interface Consumer<T>
https://docs.oracle.com/javase/8/docs/api/java/util/function/Consumer.html
Recebe um valor e não retorna nada. Diferentemente das outras interfaces funcionais, Consumir
é feito para operar com efeitos colaterais/side-effects.
Supplier
Interface Supplier<T>
https://docs.oracle.com/javase/8/docs/api/java/util/function/Supplier.html
Recebe um valor, retornando o mesmo ou um novo.
É isso; nada muito complexo, só um resuminho rápido sobre essas interfaces. Com certeza irei atualizar ele com mais informações assim que eu for praticando e encontrando novas dificuldades.
😄