Uma interface que contém exatamente um método abstrato é conhecida como interface funcional. Ele pode ter qualquer número de métodos estáticos padrão, mas pode conter apenas um método abstrato. Também pode declarar métodos de classe de objeto.
A Interface Funcional também é conhecida como Interfaces de Método Abstrato Único ou Interfaces SAM. É um novo recurso em Java, que ajuda a alcançar uma abordagem de programação funcional.
Exemplo 1
@FunctionalInterface interface sayable{ void say(String msg); } public class FunctionalInterfaceExample implements sayable{ public void say(String msg){ System.out.println(msg); } public static void main(String[] args) { FunctionalInterfaceExample fie = new FunctionalInterfaceExample(); fie.say('Hello there'); } }Teste agora
Saída:
Hello there
Uma interface funcional pode ter métodos de classe de objeto. Veja no exemplo a seguir.
Exemplo 2
@FunctionalInterface interface sayable{ void say(String msg); // abstract method // It can contain any number of Object class methods. int hashCode(); String toString(); boolean equals(Object obj); } public class FunctionalInterfaceExample2 implements sayable{ public void say(String msg){ System.out.println(msg); } public static void main(String[] args) { FunctionalInterfaceExample2 fie = new FunctionalInterfaceExample2(); fie.say('Hello there'); } }Teste agora
Saída:
Hello there
Interface funcional inválida
Uma interface funcional pode estender outra interface somente quando não possui nenhum método abstrato.
interface sayable{ void say(String msg); // abstract method } @FunctionalInterface interface Doable extends sayable{ // Invalid '@FunctionalInterface' annotation; Doable is not a functional interface void doIt(); }
Saída:
compile-time error
Exemplo 3
No exemplo a seguir, uma interface funcional se estende a uma interface não funcional.
interface Doable{ default void doIt(){ System.out.println('Do it now'); } } @FunctionalInterface interface Sayable extends Doable{ void say(String msg); // abstract method } public class FunctionalInterfaceExample3 implements Sayable{ public void say(String msg){ System.out.println(msg); } public static void main(String[] args) { FunctionalInterfaceExample3 fie = new FunctionalInterfaceExample3(); fie.say('Hello there'); fie.doIt(); } }Teste agora
Saída:
Hello there Do it now
Interfaces funcionais predefinidas Java
Java fornece interfaces funcionais predefinidas para lidar com programação funcional usando lambda e referências de método.
Você também pode definir sua própria interface funcional personalizada. A seguir está a lista de interfaces funcionais que são colocadas no pacote java.util.function.
Interface | Descrição |
---|---|
Biconsumidor | Representa uma operação que aceita dois argumentos de entrada e não retorna nenhum resultado. |
Consumidor | Representa uma operação que aceita um único argumento e não retorna nenhum resultado. |
Função | Representa uma função que aceita um argumento e retorna um resultado. |
Predicado | Representa um predicado (função com valor booleano) de um argumento. |
BiFunção | Representa uma função que aceita dois argumentos e retorna um resultado. |
Operador Binário | Representa uma operação sobre dois operandos do mesmo tipo de dados. Ele retorna um resultado do mesmo tipo dos operandos. |
BiPredicado | Representa um predicado (função com valor booleano) de dois argumentos. |
Fornecedor booleano | Representa um fornecedor de resultados com valor booleano. |
Operador DuploBinário | Representa uma operação sobre dois operandos do tipo double e retorna um valor do tipo double. |
Consumidor Duplo | Representa uma operação que aceita um único argumento de tipo duplo e não retorna nenhum resultado. |
Função Dupla | Representa uma função que aceita um argumento de tipo duplo e produz um resultado. |
Predicado Duplo | Representa um predicado (função com valor booleano) de um argumento de tipo duplo. |
Fornecedor Duplo | Representa um fornecedor de resultados do tipo duplo. |
Função DoubleToInt | Representa uma função que aceita um argumento do tipo double e produz um resultado do tipo int. |
Função DoubleToLong | Representa uma função que aceita um argumento de tipo duplo e produz um resultado de tipo longo. |
Operador DuploUnário | Representa uma operação em um único operando do tipo duplo que produz um resultado do tipo duplo. |
Operador IntBinário | Representa uma operação sobre dois operandos do tipo int e retorna um resultado do tipo int. |
Consumidor Interno | Representa uma operação que aceita um único argumento inteiro e não retorna nenhum resultado. |
Função Int | Representa uma função que aceita um argumento inteiro e retorna um resultado. |
IntPredicado | Representa um predicado (função com valor booleano) de um argumento inteiro. |
Fornecedor Interno | Representa um fornecedor do tipo inteiro. |
IntToDoubleFunction | Representa uma função que aceita um argumento inteiro e retorna um duplo. |
IntToLongFunction | Representa uma função que aceita um argumento inteiro e retorna um valor longo. |
Operador IntUnário | Representa uma operação em um único operando inteiro que produz um resultado inteiro. |
Operador Binário Longo | Representa uma operação sobre dois operandos do tipo longo e retorna um resultado do tipo longo. |
LongConsumidor | Representa uma operação que aceita um único argumento de tipo longo e não retorna nenhum resultado. |
Função Longa | Representa uma função que aceita um argumento de tipo longo e retorna um resultado. |
LongPredicado | Representa um predicado (função com valor booleano) de um argumento de tipo longo. |
Fornecedor Longo | Representa um fornecedor de resultados do tipo longo. |
Função LongToDouble | Representa uma função que aceita um argumento de tipo longo e retorna um resultado de tipo duplo. |
Função LongToInt | Representa uma função que aceita um argumento de tipo longo e retorna um resultado inteiro. |
Operador Unário Longo | Representa uma operação em um único operando do tipo longo que retorna um resultado do tipo longo. |
ObjDoubleConsumidor | Representa uma operação que aceita um objeto e um argumento duplo e não retorna nenhum resultado. |
ObjIntConsumidor | Representa uma operação que aceita um objeto e um argumento inteiro. Não retorna resultado. |
ObjLongConsumidor | Representa uma operação que aceita um objeto e um argumento longo, mas não retorna nenhum resultado. |
Fornecedor | Representa um fornecedor de resultados. |
ToDoubleBiFunction | Representa uma função que aceita dois argumentos e produz um resultado do tipo duplo. |
ToDoubleFunction | Representa uma função que retorna um resultado do tipo duplo. |
ToIntBiFunction | Representa uma função que aceita dois argumentos e retorna um número inteiro. |
ToIntFunction | Representa uma função que retorna um número inteiro. |
ToLongBiFunção | Representa uma função que aceita dois argumentos e retorna um resultado do tipo longo. |
ToLongFunction | Representa uma função que retorna um resultado do tipo longo. |
Operador Unário | Representa uma operação em um único operando que retorna um resultado do mesmo tipo que seu operando. |