DEV Community

Igor Rudel
Igor Rudel

Posted on

Interface Funcional: EVITE esse uso!

Na atual versão LTS do Java (21) existem muitas interfaces funcionais, dentre as principais: Function, Predicate, Supplier e Consumer.

Existem muitas outras no pacote java.util.function

É comum vermos uso de tais interfaces como no exemplo do código abaixo:

private static class ClassMapperFn implements Function<Integer, String> {

        @Override
        public String apply(final Integer integer) {
            return integer.toString();
        }
}
Enter fullscreen mode Exit fullscreen mode

Em 98% dos casos (se não 100), no meu ponto de vista, isto é uma má utilização das interfaces funcionais.

Vejamos o código abaixo:

private static class ClassMapper {

        public String apply(final Integer integer) {
            return integer.toString();
        }
}
Enter fullscreen mode Exit fullscreen mode

Ele possui o MESMO comportamento e tem a mesma aplicabilidade que o de cima! Afinal o Java é esperto o suficiente para entender que implicitamente o método é uma Function, de um tipo para outro!

Aplicando o exemplo com a definição explícita:

final var mapperFn = new ClassMapperFn();
System.out.println(mapperFn.apply(101));

Stream.of(1, 2, 3, 4, 5)
   .map(mapperFn::apply)
   .forEach(System.out::println);
Enter fullscreen mode Exit fullscreen mode

Aplicando o exemplo com a definição implícita:

final var mapper = new ClassMapper();
System.out.println(mapper.apply(101));

Stream.of(1, 2, 3, 4, 5)
   .map(mapper::apply)
   .forEach(System.out::println);
Enter fullscreen mode Exit fullscreen mode

São exatamente iguais! Ou seja, é verboso e desnecessário a definição explícita.

Por último, mas não menos importante, no momento de desenvolvimento é comum usarmos atalhos de nossas IDE's para identificarmos usos de variáveis, métodos, classes e etc.
Eu utilizo de IDE o IntelliJ e, por padrão, dois atalhos que faço uso em análises de código são: Ctrl + Mouse 1, ou, Alt + F7. Ambos os atalhos se usados em um método sobreescrito de uma implementação de função (caso 1) exibem TODOS os locais (do projeto e dependências) onde é utilizado o "apply" da Function do Java, se usado no método sem sobreescrita do método da função (caso 2) exibe APENAS os locais usados na aplicação.

Heroku

This site is built on Heroku

Join the ranks of developers at Salesforce, Airbase, DEV, and more who deploy their mission critical applications on Heroku. Sign up today and launch your first app!

Get Started

Top comments (0)

Cloudinary image

Optimize, customize, deliver, manage and analyze your images.

Remove background in all your web images at the same time, use outpainting to expand images with matching content, remove objects via open-set object detection and fill, recolor, crop, resize... Discover these and hundreds more ways to manage your web images and videos on a scale.

Learn more

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay