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.

😄

Did you find this article valuable?

Support Henry Barreto by becoming a sponsor. Any amount is appreciated!