English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Una interfaz funcional (Functional Interface) es una interfaz que tiene solo un método abstracto, pero puede tener varios métodos no abstractos.
Las interfaces funcionales pueden convertirse implícitamente en expresiones Lambda.
Expresiones Lambda y referencias a métodos (que también se pueden considerar como expresiones Lambda).
Por ejemplo, si se define una interfaz funcional así:
@FunctionalInterface interface GreetingService { void sayMessage(String message); }
Entonces se puede usar una expresión Lambda para representar una implementación de esta interfaz (nota: JAVA 8 Antes generalmente se implementaba con una clase anónima):
GreetingService greetService1 message -System.out.println("Hello ") + message);
las interfaces funcionales pueden proporcionar un soporte amigable a las expresiones lambda existentes.
JDK 1.8 interfaz funcional existente 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 nuevas interfaces de función adicionadas:
java.util.function
java.util.function contiene muchas clases, que se utilizan para apoyar la programación funcional de Java, las interfaces funcionales en este paquete incluyen:
número de serie | interfaz & descripción |
---|---|
1 | BiConsumer<T,U> representa una operación que acepta dos parámetros de entrada y no devuelve ningún resultado |
2 | BiFunction<T,U,R> representa un método que acepta dos parámetros de entrada y devuelve un resultado |
3 | BinaryOperator<T> representa una operación sobre dos operadores del mismo tipo y devuelve un resultado del mismo tipo |
4 | BiPredicate<T,U> representa un método booleano con dos parámetros |
5 | BooleanSupplier representa el proveedor de un resultado booleano |
6 | Consumer<T> representa una operación que acepta un parámetro de entrada y no devuelve ningún resultado |
7 | DoubleBinaryOperator representa una operación sobre operadores de dos valores double y devuelve un resultado double. |
8 | DoubleConsumer representa una operación que acepta un parámetro de valor double y no devuelve ningún resultado. |
9 | DoubleFunction<R> representa un método que acepta un parámetro de valor double y devuelve un resultado |
10 | DoublePredicate representa un método booleano con parámetro double |
11 | DoubleSupplier representa el proveedor de una estructura de valor double |
12 | DoubleToIntFunction Acepta un parámetro de tipo double, devuelve un resultado de tipo int. |
13 | DoubleToLongFunction Acepta un parámetro de tipo double, devuelve un resultado de tipo long. |
14 | DoubleUnaryOperator Acepta un parámetro de tipo double, el tipo de valor de retorno también es double. |
15 | Function<T,R> Acepta un parámetro de entrada, devuelve un resultado. |
16 | IntBinaryOperator Acepta dos parámetros de tipo int, el tipo de valor de retorno también es int. |
17 | IntConsumer Acepta un parámetro de tipo int, sin valor de retorno. |
18 | IntFunction<R> Acepta un parámetro de tipo int, devuelve un resultado. |
19 | IntPredicate Acepta un parámetro de tipo int, devuelve un resultado de tipo boolean. |
20 | IntSupplier Sin parámetros, devuelve un resultado de tipo int. |
21 | IntToDoubleFunction Acepta un parámetro de tipo int, devuelve un resultado de tipo double. |
22 | IntToLongFunction Acepta un parámetro de tipo int, devuelve un resultado de tipo long. |
23 | IntUnaryOperator Acepta un parámetro de tipo int, el tipo de valor de retorno también es int. |
24 | LongBinaryOperator Acepta dos parámetros de tipo long, el tipo de valor de retorno también es long. |
25 | LongConsumer Acepta un parámetro de tipo long, sin valor de retorno. |
26 | LongFunction<R> Acepta un parámetro de entrada de tipo long, devuelve un resultado. |
27 | LongPredicate R acepta un parámetro de entrada de tipo long, devuelve un resultado de tipo boolean. |
28 | LongSupplier Sin parámetros, devuelve un valor de tipo long. |
29 | LongToDoubleFunction Acepta un parámetro de tipo long, devuelve un resultado de tipo double. |
30 | LongToIntFunction Acepta un parámetro de tipo long, devuelve un resultado de tipo int. |
31 | LongUnaryOperator Acepta un parámetro de tipo long, el tipo de valor de retorno también es long. |
32 | ObjDoubleConsumer<T> Acepta un parámetro de tipo object y un parámetro de tipo double, sin valor de retorno. |
33 | ObjIntConsumer<T> Acepta un parámetro de tipo object y un parámetro de tipo int, sin valor de retorno. |
34 | ObjLongConsumer<T> Acepta un parámetro de tipo object y un parámetro de tipo long, sin retorno. |
35 | Predicate<T> Acepta un parámetro de entrada, devuelve un valor booleano. |
36 | Supplier<T> Sin parámetros, devuelve un resultado. |
37 | ToDoubleBiFunction<T,U> Acepta dos parámetros de entrada, devuelve un resultado de tipo double |
38 | ToDoubleFunction<T> Acepta un parámetro de entrada, devuelve un resultado de tipo double |
39 | ToIntBiFunction<T,U> Acepta dos parámetros de entrada, devuelve un resultado de tipo int. |
40 | ToIntFunction<T> Acepta un parámetro de entrada, devuelve un resultado de tipo int. |
41 | ToLongBiFunction<T,U> Acepta dos parámetros de entrada, devuelve un resultado de tipo long. |
42 | ToLongFunction<T> Acepta un parámetro de entrada, devuelve un resultado de tipo long. |
43 | UnaryOperator<T> Acepta un parámetro de tipo T, el tipo de retorno también es T. |
La interfaz Predicate <T> es una interfaz funcional, que acepta un parámetro de entrada T y devuelve un valor de resultado booleano.
Esta interfaz contiene varios métodos por defecto para combinar Predicate en otros lógicos complejos (por ejemplo: y, o, no).
Esta interfaz se utiliza para probar si un objeto es true o false.
Podemos ver el siguiente ejemplo (Java8para entender el uso de la interfaz funcional Predicate <T> en Tester.java):
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 es un parámetro pasado al método test de la interfaz Predicate // n si existe, el método test devuelve true System.out.println("Imprimir todos los datos:"); // pasar el parámetro n eval(list, n->true); // Predicate<Integer> predicate1 es igual a n -> n%}}2 es igual a 0 // n es un parámetro pasado al método test de la interfaz Predicate // si n%2 para 0 el método test devuelve true System.out.println("Imprimir todos los números pares:"); eval(list, n-> n%}}2 es igual a 0 ); // Predicate<Integer> predicate2 es igual a n -> n > 3 // n es un parámetro pasado al método test de la interfaz Predicate // Si n es mayor que 3 El método test devuelve true System.out.println("Salida mayor que 3 Todos los 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 + " "); } } } }
Ejecutar el siguiente script, el resultado de salida será:
$ javac Java8Tester.java $ java Java8Tester Salida de todos los datos: 1 2 3 4 5 6 7 8 9 Salida de todos los números pares: 2 4 6 8 Salida mayor que 3 Todos los números del: 4 5 6 7 8 9