English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Interface funcional (Functional Interface) é uma interface que possui apenas um método abstrato, mas pode ter vários métodos não abstratos.
As interfaces funcionais podem ser convertidas implicitamente em expressões Lambda.
Expressões Lambda e referências a métodos (na verdade também são expressões Lambda).
Como definir uma interface funcional conforme abaixo:
@FunctionalInterface interface GreetingService { void sayMessage(String message); }
Então, pode-se usar uma expressão Lambda para representar uma implementação dessa interface (Nota: JAVA 8 Antes, geralmente era implementado com uma classe anônima):
GreetingService greetService1 message -System.out.println("Hello ") + message);
as interfaces funcionais podem suportar lambdas existentes de maneira amigável.
JDK 1.8 interfases funcionais existentes anteriormente:
java.lang.Runnable
java.util.concurrent.Callable
java.security.PrivilegedAction
java.util.Comparator
java.io.FileFilter
java.nio.file.PathMatcher
java.lang.reflect.InvocationHandler
java.beans.PropertyChangeListener
java.awt.event.ActionListener
javax.swing.event.ChangeListener
JDK 1.8 novas interfaces de função adicionadas:
java.util.function
java.util.function contém muitos classes, usadas para suportar programação funcional em Java, as interfaces funcionais no pacote são:
número de série | interface & descrição |
---|---|
1 | BiConsumer<T,U> representa uma operação que aceita dois parâmetros de entrada e não retorna nenhum resultado |
2 | BiFunction<T,U,R> representa um método que aceita dois parâmetros de entrada e retorna um resultado |
3 | BinaryOperator<T> representa uma operação sobre dois operadores do mesmo tipo, que retorna um resultado do mesmo tipo |
4 | BiPredicate<T,U> representa um método booleano com dois parâmetros |
5 | BooleanSupplier representa o provedor de um resultado booleano |
6 | Consumer<T> representa uma operação que aceita um parâmetro de entrada e não retorna nenhum resultado |
7 | DoubleBinaryOperator representa uma operação sobre dois operadores de valor double, que retorna um resultado de valor double. |
8 | DoubleConsumer representa uma operação que aceita um parâmetro de valor double e não retorna nenhum resultado. |
9 | DoubleFunction<R> representa um método que aceita um parâmetro de valor double e retorna um resultado |
10 | DoublePredicate representa um método booleano com parâmetro double |
11 | DoubleSupplier representa o provedor de uma estrutura de valor double |
12 | DoubleToIntFunction Aceita um parâmetro do tipo double e retorna um resultado do tipo int. |
13 | DoubleToLongFunction Aceita um parâmetro do tipo double e retorna um resultado do tipo long |
14 | DoubleUnaryOperator Aceita um parâmetro do tipo double e retorna um valor do tipo double. |
15 | Function<T,R> Aceita um parâmetro de entrada e retorna um resultado. |
16 | IntBinaryOperator Aceita dois parâmetros do tipo int e retorna um valor do tipo int. |
17 | IntConsumer Aceita um parâmetro de entrada do tipo int, sem retornar nenhum valor. |
18 | IntFunction<R> Aceita um parâmetro de entrada do tipo int e retorna um resultado. |
19 | IntPredicate Aceita um parâmetro de entrada do tipo int e retorna um resultado do tipo boolean. |
20 | IntSupplier Sem parâmetros, retorna um resultado do tipo int. |
21 | IntToDoubleFunction Aceita um parâmetro do tipo int e retorna um resultado do tipo double. |
22 | IntToLongFunction Aceita um parâmetro do tipo int e retorna um resultado do tipo long. |
23 | IntUnaryOperator Aceita um parâmetro do tipo int e retorna um valor do tipo int. |
24 | LongBinaryOperator Aceita dois parâmetros do tipo long e retorna um valor do tipo long. |
25 | LongConsumer Aceita um parâmetro de entrada do tipo long, sem retornar nenhum valor. |
26 | LongFunction<R> Aceita um parâmetro de entrada do tipo long e retorna um resultado. |
27 | LongPredicate R aceita um parâmetro de entrada do tipo long e retorna um resultado do tipo boolean. |
28 | LongSupplier Sem parâmetros, retorna um valor do tipo long. |
29 | LongToDoubleFunction Aceita um parâmetro do tipo long e retorna um resultado do tipo double. |
30 | LongToIntFunction Aceita um parâmetro do tipo long e retorna um resultado do tipo int. |
31 | LongUnaryOperator Aceita um parâmetro do tipo long e retorna um valor do tipo long. |
32 | ObjDoubleConsumer<T> Aceita um parâmetro do tipo object e um parâmetro do tipo double, sem retornar nenhum valor. |
33 | ObjIntConsumer<T> Aceita um parâmetro do tipo object e um parâmetro do tipo int, sem retornar nenhum valor. |
34 | ObjLongConsumer<T> Aceita um parâmetro do tipo object e um parâmetro do tipo long, sem retorno. |
35 | Predicate<T> Aceita um parâmetro de entrada e retorna um valor booleano. |
36 | Supplier<T> Sem parâmetros, retorna um resultado. |
37 | ToDoubleBiFunction<T,U> Aceita dois parâmetros de entrada e retorna um valor do tipo double. |
38 | ToDoubleFunction<T> Aceita um parâmetro de entrada e retorna um valor do tipo double. |
39 | ToIntBiFunction<T,U> Aceita dois parâmetros de entrada e retorna um valor do tipo int. |
40 | ToIntFunction<T> Aceita um parâmetro de entrada e retorna um valor do tipo int. |
41 | ToLongBiFunction<T,U> Aceita dois parâmetros de entrada e retorna um valor do tipo long. |
42 | ToLongFunction<T> Aceita um parâmetro de entrada e retorna um valor do tipo long. |
43 | UnaryOperator<T> Aceita um parâmetro do tipo T e retorna um valor do tipo T. |
A interface Predicate <T> é uma interface funcional, que aceita um parâmetro de entrada T e retorna um valor booleano.
Esta interface contém vários métodos padrão para combinar Predicate em lógicas complexas (por exemplo: e, ou, não).
Esta interface é usada para testar se um objeto é true ou false.
Podemos usar o seguinte exemplo (Java8para entender o uso da interface funcional Predicate <T>:
import java.util.Arrays; import java.util.List; import java.util.function.Predicate; public class Java8Tester { public static void main(String args[]){ List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9); // Predicate<Integer> predicate = n ->true // n é um parâmetro passado para o método test da interface Predicate // se n existir, o método test retorna true System.out.println("Imprimir todos os dados:"); // passar o parâmetro n eval(list, n->true); // Predicate<Integer> predicate1 igual a n -> n%2 == 0 // n é um parâmetro passado para o método test da interface Predicate // se n%2 Se 0, o método test retorna true System.out.println("Imprimir todos os números pares:"); eval(list, n-> n%2 igual a 0 ); // Predicate<Integer> predicate2 igual a n -> n > 3 // n é um parâmetro passado para o método test da interface Predicate // se n for maior que 3 método test retorna true System.out.println("Saída maior que 3 todos os números:"); eval(list, n-> n > 3 ); } public static void eval(List<Integer> list, Predicate<Integer> predicate) { for(Integer n: list) { if(predicate.test(n)) { System.out.println(n + " "); } } } }
Execute o script acima, o resultado será:
$ javac Java8Tester.java $ java Java8Tester Saída de todos os dados: 1 2 3 4 5 6 7 8 9 Saída de todos os números pares: 2 4 6 8 Saída maior que 3 Todos os números: 4 5 6 7 8 9