Uma das novas funcionalidades introduzidas por Java 8 são as Interfaces funcionais (functional interfaces).
Elas são interfaces que possuem um único método abstrato. Porém, métodos sobrescrevendo métodos da classe java.lang.Object não são considerados métodos da própria interface. E default method não é considerado método abstrato. Portanto ao utilizar esses métodos a interface não deixa de ser uma interface funcional.
Pode-se utilizar a annotation @FunctionalInterface para garantir que uma Interface não deixará de ser uma Interface funcional.
Exemplo de Interface Funcional:
@FunctionalInterface
public interface TestingFunctionalInterface {
String fiMethod(String test);
}
O Java 8 já possui algumas interfaces funcionais prontas. As mais famosas são:
- Consumer
Recebe um objeto/valor, faz algo com ele. Mas não retorna nada.
Ex:foreach( ) - BiConsumer
Funciona igual ao Consumer, porém ao invés de receber um único valor, recebe dois. Faz algo com eles, e não retorna nada. - Supplier
Não recebe nenhum argumento, porém devolve objetos/valores.
Ex:Stream.generate( ) - Predicate
Recebe 1 argumento e retorna true ou false.
Ex:stream( ). filter( ) - BiPredicate
Igualmente ao predicate retorna true ou false, porém recebe 2 argumentos. - Function
Recebe 1 argumento e retorna um objeto/valor.
Ex:stream( ).map( ) - BiFunction
Assim como a function retorna um objeto/valor, mas recebe 2 argumentos. - UnaryOperator
Igual a function, porém o argumento deverá ser do mesmo tipo do retorno. - BinaryOperator
Igual a BiFunction, porém os 2 argumentos de entrada e o retorno todos devem ter o mesmo tipo.
Ex:stream( ).reduce( )
public static void main(String[] args) {
List<String> testList = new ArrayList<>();
List<String> stringList = Arrays.asList("A","B","C","D","E");
String test = Stream.generate(() -> "x").limit(110).collect(Collectors.joining());//Supplier
System.out.println(test);
testList = stringList.stream().filter(word -> word.equals("A")).collect(Collectors.toList()); //Predicate
testList.forEach(word -> System.out.println(word)); //Consumer
stringList.stream().map(word -> word.equals("A")); //Function
stringList.stream().reduce((w1,w2) -> w2 + w1); //Reduce
}
Algumas interfaces anteriores ao Java 8 também acabaram se enquadrando na categoria de Interfaces Funcionais, por possuírem a estrutura requisitada, são elas:
- Runnable
- Callable
Espero que esse conteúdo tenha te ajudado em algo.
Se tem alguma sugestão para melhorar esse artigo, ou encontrou algum erro nele, por favor deixe um comentário, que eu corrijo. Se gostou, por favor compartilhe nas suas redes e ajude o blog.
Te vejo na próxima!
Fontes:
https://docs.oracle.com/javase/8/docs/api/java/lang/FunctionalInterface.html
https://www.youtube.com/watch?v=Ht0eto2mEpc