La interfaz funcional es una interfaz que solo tiene un método abstracto, pero puede tener múltiples métodos que no son de abstracto.
Las interfaces funcionales se pueden convertir implícitamente en expresiones lambda.
Las interfaces funcionales pueden admitir Lambdas amigables con las funciones existentes.
introducir
Las interfaces funcionales son en realidad una clase de interfaz abstracta. Las siguientes interfaces funcionales se han encontrado antes de Java 8.
java.lang.runnablejava.util.concurrent.callablejava.util.comparator
etc...
Cómo usar
De hecho, la clase de interfaz mencionada anteriormente solo debe modificarse con la anotación de la interfaz funcional y se convierte en una interfaz funcional en Java. Por ejemplo, la definición de interfaz de llamada en JDK
@FunctionalInterfacePublic Interface Callable <V> {V Call () arroja excepción;}Es así de simple.
Ahora hablemos sobre la nueva interfaz de función agregada a Java 8. Aquí está su definición
// t es el parámetro entrante // r es el parámetro de retorno @FunctionalInterfacePublic Interface Función <t, r> {r aplic (t t); predeterminado <v> function <v, r> compose (function <? Super v, "extiende t> antes {objetos.requirenonnull (antes); return (v v) -> aplicar (antes.apply (v));} predeterminado <v> function <t, v> andthen (function <? Super r," extiende v> después) {objetos.RequirenNull (después); return (return (t) - - - - - - -extiende After.apply (aplicar (t));Se puede entender como una función puntero en el lenguaje C (opinión personal).
En uso real, el método de aplicación es ampliamente utilizado. Compose/Andthen se usa principalmente en escenarios donde se realizan más de dos interfaces de funciones y secuencia de ejecución.
En un código comercial específico, generalmente lo uso en combinación con Bifuncton/Proveedor. La bifunción admite 2 parámetros, la función admite solo un parámetro. El proveedor se puede usar para almacenar valores necesarios específicos y obtenerlos a través de Get.
ejemplo
Referencias al código en el que suele trabajar. Este ejemplo evita principalmente múltiples condiciones de juicio que causan un código hinchado. Al mismo tiempo, la misma lógica comercial se puede abstraer de la interfaz de función, de modo que el código se pueda reutilizar en múltiples lugares. El código específico es el siguiente.
Función <objeto, Integer> ActionTest1 = (objeto) -> {// Logic return 0;}; function <Object, Integer> ActionTest2 = (Object) -> {// Logic Return 0;}; Public Proveier <Map <integer, function <Object, Integer >>> ActionUpplier = () -> {Map <Integer, Function <Object, Integer, Mapsin Hashmap <> (); maps.put (1, ActionTest1); maps.put (2, ActionTest2); return maps;}; // use public void test (int type, objeto objeto) {opcional.ofnullable (accionesupplier.get (). get (type)). IfPresent (x -> x.apply (v, objeto)); // if/else Logic if (type == 1) {// Test1 Logic} else if (type == 2) {// test2 logic}}Resumir
Personalmente, creo que en escenarios en los que hay más juicios sobre las ramas lógicas de negocios, es más adecuado para usar la función, y existen los siguientes beneficios.
Ejemplo de interfaz funcional
La interfaz de predicado <t> es una interfaz funcional que acepta un parámetro de entrada t y devuelve un resultado booleano.
Esta interfaz contiene una variedad de métodos predeterminados para combinar predicado en otras lógicas complejas (como: versus o, no).
Esta interfaz se usa para probar el objeto es verdadero o falso.
Podemos entender el uso del predicado de interfaz funcional <T> a través del siguiente ejemplo (java8tester.java):
Java8tester.java File Import java.util.arrays; import java.util.list; import java.util.function.predicate; clase pública java8tester {public static void main (String args []) {list <integer> list = arrays.aslist (1, 2, 3, 4, 5, 6, 7, 8, 9); // predicada <integer> predicate = n -> true // n es un método de prueba que pasa argumentos a la interfaz de predicado // n Si existe, el método de prueba devuelve true System.out.println ("Out todos los datos:"); // pasar el parámetro n eval (lista, n-> true); // predicada <integer> predict1 = n -> n%2 == 0 // n es un método de prueba que pasa el parámetro a la interfaz de predicado // si n%2 del método de prueba devuelve verdadero system.out.println ("Out todos los números par:"); eval (lista, n-> n%2 == 0); // predicada <integer> predict2 = n -> n> 3 // n es un método de prueba que pasa el parámetro a la interfaz de predicado // si n es mayor que 3 método de prueba devuelve verdadero system.out.println ("emitir todos los números superiores a 3:"); eval (lista, n-> n> 3); } public static void eval (list <integer> list, predicate <integer> predicte) {for (integer n: list) {if (predicate.test (n)) {system.out.println (n + ""); }}}}Ejecutar el script anterior y el resultado de la salida es:
$ javac java8tester.java
$ Java Java8Tester
Salir todos los datos:
1
2
3
4
5
6
7
8
9
Emitir todos los números uniformes:
2
4
6
8
ENCONTRA TODOS LOS NÚMEROS MÁS DE 3:
4
5
6
7
8
9
Resumir
Lo anterior es la interfaz funcional de la función Java 8 y los ejemplos de interfaz funcional introducidos por el editor. Espero que sea útil para todos. Si tiene alguna pregunta, déjame un mensaje y el editor responderá a todos a tiempo. ¡Muchas gracias por su apoyo al sitio web de Wulin.com!