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();
}
}
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();
}
}
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);
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);
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.
Top comments (0)