A continuación continuamos sumergiendo en el modelo de programación funcional Java8
Public Class Test1 {public static void main (String [] args) {list <integer> list = arrays.aslist (1,2,3,4,5,6,7,8,9,9,10); list.ForEach (nuevo consumidor <Integer> () {@Override public void Accept (Integer Integer) {System.out.println (Integer);}}); }}Este programa es simple, primero inicializa una colección de tipo entero y luego emite cada elemento a la consola. Entre ellos, notamos el método foreach, que es el método predeterminado recientemente agregado en Java 8.
interfaz pública iterable <t> {. . omitir. predeterminado void foreach (consumidor <? Super t> acción) {objetos.requirenonnull (acción); para (t t: this) {action.accept (t); }}}Se declara en la interfaz Iterable y se modifica por la palabra clave predeterminada. De esta manera, cualquier subtipo de esta interfaz puede heredar la implementación del método foreach, por lo que la interfaz de la lista es una subinterfaz indirecta de Iterable, por lo que también hereda el método predeterminado. Java8 adopta esta forma inteligente de extender las funciones de la interfaz y es compatible con la versión anterior.
A continuación, analizamos la implementación de Foreach. Primero, recibimos una acción de parámetros del tipo de consumidor, realizamos un juicio no vacío y luego atraviesamos todos los elementos actuales y los entregamos al método de aceptación de la acción para el procesamiento. Entonces, ¿qué diablos es el consumidor? Mira el código fuente
@FunctionalInterfacePublic Interface Consumer <T> { /*** Realiza esta operación en el argumento dado. * * @param t el argumento de entrada */ void aceptar (t t); . .Mited.} Una interfaz, con solo un método abstracto, se modifica por @FunctionalInterface, una interfaz funcional típica.
Ok, ahora sabemos que el parámetro del tipo de consumidor recibido por foreach es una interfaz funcional. El único método de aceptación de abstracto en la interfaz recibe un parámetro y no devuelve un valor. Del artículo anterior, sabemos que una de las formas de crear instancias de tipos de interfaz funcional es usar expresiones lambda, para que pueda transformar el programa superior.
Public Class Test1 {public static void main (String [] args) {list <integer> list = arrays.aslist (1,2,3,4,5,6,7,8,9,9,10); // La expresión de Lambda recibe un parámetro sin devolver la lista de valores. }} El elemento de expresión de Lambda -> System.out.println (item) recibe un parámetro sin devolver un valor, y cumple con los requisitos de firma del método de aceptación y se compila y pasa.
Es decir, si se usa una expresión de lambda para crear una instancia de interfaz funcional, los parámetros de entrada y el retorno de esta expresión de lambda deben ajustarse a la firma del método del único método abstracto en esta interfaz funcional.
A continuación, el programa se modificará
Public Class Test1 {public static void main (String [] args) {list <integer> list = arrays.aslist (1,2,3,4,5,6,7,8,9,9,10); // Lista de referencias de métodos }} Vi dos colons detrás, pero de todos modos estaba en un desastre. . . Esta es la segunda forma de crear una instancia de interfaz funcional: método de referencia de referencia La sintaxis de referencia es objeto :: nombre del método
Del mismo modo, el uso del método de referencia del método para crear instancias de interfaz funcional también debe cumplir con la definición de firma del método. Consulte el código fuente del método println aquí
public void println (objeto x) {string s = string.valueOf (x); sincronizado (this) {imprimir (s); newline (); }} Reciba un parámetro y no devuelve el valor, y lo compila.
Finalmente, echemos un vistazo al último tipo de creación de una interfaz funcional. El tercer método: construir referencia del método y continuar modificando el programa.
Public Class Test1 {public static void main (String [] args) {list <integer> list = arrays.aslist (1,2,3,4,5,6,7,8,9,9,10); // Lista de referencias de métodos de constructor. ForEach (test1 :: new); } Test1 (Integer I) {System.out.println (i); }} La sintaxis a la que se hace referencia el constructor es: Nombre de clase :: nuevo
Hemos agregado un nuevo constructor a Test1, que recibe un parámetro, no devuelve un valor y se compila. (Para mostrar el uso de citas de constructor solamente)
Según el artículo anterior, podemos resumir tres formas de crear tipos de interfaz funcional:
1. Expresión de lambda
2. Cita de método
3. Referencia del método del constructor
Nota: No importa qué método, la firma del método debe estar en línea con el método abstracto.