Hablando de Java 8, lo primero que me viene a la mente es lambda (cierre) y el método de extensión virtual (método predeterminado). Esta característica ha sido promocionada durante mucho tiempo por los principales sitios web de tecnología, y también es la primera característica de la que hablaremos en el. Al comienzo de nuestra serie Java 8 (JEP126 http://openjdk.java.net/jeps/126), algunas bibliotecas de jdk8 se han rediseñado utilizando expresiones lambda. Comprenderlo es de gran importancia para aprender las nuevas características de Java 8.
1. Interfaz funcional
Interfaz funcional (la interfaz funcional también se llama interfaz funcional, pero en realidad es lo mismo). En pocas palabras, una interfaz funcional es una interfaz que contiene solo un método. Por ejemplo, java.lang.Runnable y java.util.Comparator en la biblioteca estándar de Java son interfaces funcionales típicas. Java 8 proporciona @FunctionalInterface como anotación. Esta anotación no es necesaria siempre que la interfaz cumpla con los estándares de las interfaces funcionales (es decir, una interfaz que solo contiene un método), la máquina virtual la determinará automáticamente. Es mejor usar la anotación @FunctionalInterface en la interfaz para declararla. Esto evita que otras personas en el equipo agreguen nuevos métodos a la interfaz por error.
Lambda en Java no puede aparecer solo. Requiere una interfaz funcional para contenerlo. El cuerpo del método de expresión lambda es en realidad la implementación de la interfaz funcional. La sintaxis se analizará a continuación.
2. Sintaxis lambda
Contiene tres partes
1. Un parámetro formal separado por comas entre paréntesis. El parámetro es el parámetro del método en la interfaz funcional.
2. Un símbolo de flecha: ->
3. El cuerpo del método puede ser una expresión o un bloque de código. El cuerpo del método es la implementación del método en la interfaz funcional. Si es un bloque de código, debe estar envuelto con {} y se requiere un valor de retorno. hay una excepción. Si el valor de retorno del método en una interfaz funcional es nulo, no se necesita {}.
En general se ve así:
Copie el código de código de la siguiente manera:
(parámetros) -> expresión o (parámetros) -> { declaraciones }
Vea un ejemplo completo para una fácil comprensión.
Copie el código de código de la siguiente manera:
/**
* Prueba de expresión lambda
*
* @autor benhail
*/
clase pública TestLambda {
público estático vacío runThreadUseLambda() {
//Runnable es una interfaz de función que solo contiene un método de ejecución sin parámetros que devuelve void;
// Entonces no hay parámetros en el lado izquierdo de la expresión lambda y no hay retorno en el lado derecho. Simplemente imprime una oración.
new Thread(() ->System.out.println("hilo implementado por lambda")).start();
}
público estático vacío runThreadUseInnerClass() {
//No hablaré mucho sobre este método. Era un enfoque común en versiones anteriores.
nuevo hilo (nuevo ejecutable() {
@Anular
ejecución pública vacía() {
System.out.println("Subproceso implementado por clase interna");
}
}).comenzar();
}
público estático vacío principal (String [] argumentos) {
TestLambda.runThreadUseLambda();
TestLambda.runThreadUseInnerClass();
}
}
Se puede ver que el código diseñado utilizando expresiones lambda será más conciso y legible.
3. Referencia del método
De hecho, es una forma simplificada de escribir una expresión lambda. El método al que se hace referencia es en realidad la implementación del cuerpo del método de la expresión lambda. La sintaxis también es muy simple. El lado izquierdo es el contenedor (puede ser un nombre de clase o un nombre de instancia). el del medio es "::" y el lado derecho es el nombre del método correspondiente. Como se muestra a continuación:
Copie el código de la siguiente manera: ObjectReference::methodName
El formato de cita del método general es
Si es un método estático, es ClassName::methodName. Como por ejemplo Objeto::es igual
Si es un método de instancia, es Instancia::nombremétodo. Como Objeto obj=new Object();obj::equals;
Constructor. Es ClassName::new
Veamos un ejemplo completo para una mejor comprensión:
Copie el código de código de la siguiente manera:
importar java.awt.FlowLayout;
importar java.awt.event.ActionEvent;
importar javax.swing.JButton;
importar javax.swing.JFrame;
/**
*
* @autor benhail
*/
clase pública TestMethodReference {
público estático vacío principal (String [] argumentos) {
Marco JFrame = nuevo JFrame();
frame.setLayout(nuevo FlowLayout());
frame.setVisible (verdadero);
JButton botón1 = nuevo JButton("¡Haz clic en mí!");
JButton button2 = new JButton("¡Haz clic en mí también!");
frame.getContentPane().add(botón1);
frame.getContentPane().add(botón2);
// El parámetro del método addActionListener aquí es ActionListener, que es una interfaz funcional
//Utiliza el método de expresión lambda
button1.addActionListener(e -> { System.out.println("Aquí está la implementación de Lambda"); });
//Usar método de referencia
botón2.addActionListener(TestMethodReference::doSomething);
}
/**
* Aquí está el método de implementación de la interfaz funcional ActionListener
* @param e
*/
público estático vacío hacer algo (ActionEvent e) {
System.out.println("Aquí está la implementación de referencia del método");
}
}
Se puede ver que el método doSomething es la implementación de la expresión lambda. La ventaja de esto es que si cree que el método lambda es muy largo y afecta la legibilidad del código, la referencia al método es una solución.
4. Resumen
Lo anterior es el contenido completo de la sintaxis de las expresiones lambda. Creo que todos tienen cierta comprensión de las expresiones lambda. Sin embargo, si el código es simple, no impresionará a muchos espectadores. De hecho, lo urgente. La necesidad de introducir lambda en Java 8 es porque lambda Las expresiones pueden simplificar el procesamiento de datos de múltiples subprocesos o múltiples núcleos en una colección y proporcionar una velocidad de procesamiento de recopilación más rápida. Esto se discutirá más adelante. Esta característica de JEP126 se dividirá en tres partes. Hay demasiadas cosas para escribir. Esta parte familiariza a los lectores con la sintaxis y los conceptos de las expresiones lambda y las referencias de métodos. La segunda parte trata sobre el contenido de los métodos de extensión virtuales (métodos predeterminados). Grandes colecciones de datos y soluciones. Descubra el poder de las expresiones lambda. Manténganse al tanto. . . .