Java 8 se llama la versión más cambiada en la historia de Java. Contiene muchas características nuevas importantes, la mayor cantidad es la adición de expresiones lambda y Streamapi. Los dos también se pueden usar juntos. Primero, echemos un vistazo a lo que es una expresión lambda.
El uso de expresiones lambda no solo hace que el código sea simple, sino también legible, y lo más importante, la cantidad de código también disminuye mucho. Sin embargo, hasta cierto punto, estas funciones se han utilizado ampliamente en idiomas JVM como Scala.
No es sorprendente que la comunidad de Scala sea increíble, porque gran parte del contenido de Java 8 parece haber sido trasladado de Scala. Hasta cierto punto, la sintaxis de Java 8 es más detallada pero no muy clara que la de Scala, pero eso no dice mucho, y si puede, podría construir expresiones lambda como lo hace Scala.
Por un lado, si Java continúa desarrollando e implementando funciones que Scala ya ha implementado en torno a Lambda, entonces SCALA puede no ser necesaria. Por otro lado, si solo proporciona algunas características centrales, como ayudar a clases internas anónimas, Scala y otros idiomas continuarán prosperando y puede superar a Java. De hecho, este es el mejor resultado. Solo con la competencia puede haber progreso. Otros idiomas continúan desarrollándose y creciendo, y no hay necesidad de preocuparse por si estarán desactualizados.
Expresión de Lambda, la explicación en Wikipedia es un operador utilizado para representar funciones y cierres anónimos. Siento que esta explicación sigue siendo muy abstracta. Veamos un ejemplo.
public class swingtest {public static void main (string [] args) {jframe jframe = new jframe ("my jframe"); JButton JButton = new JButton ("My JButton"); jButton.AddActionListener (new ActionListener () {@Override public void ActionPerformed (ActionEvent E) {System.out.println ("¡Botón presionado!");}}); jframe.add (JButton); jframe.pack (); jframe.setVisible (verdadero); jframe.setDefaultCloseOperation (jframe.exit_on_close); }}Este es un código en la programación Swing que une un evento de escucha al botón. Cuando se hace clic en el botón, el contenido "¡Presentado en botones!" se emitirá en la consola. Aquí creamos una instancia de una clase interna anónima para unir al oyente, que también es un formulario de organización de código relativamente común en el pasado. Pero si miramos de cerca, encontraremos que, de hecho, en lo que realmente nos estamos centrando es un parámetro E de ActionEvent Type y la declaración System.out.println ("¡Buttonsedess!"); Salida a la consola.
Si el código en el programa anterior que crea una clase interna anónima se reemplaza con una expresión de Lambda, el código es el siguiente
public class swingtest {public static void main (string [] args) {jframe jframe = new jframe ("my jframe"); JButton JButton = new JButton ("My JButton"); jButton.AddactionListener (e -> System.out.println ("¡Botón presionado!")); jframe.add (JButton); jframe.pack (); jframe.setVisible (verdadero); jframe.setDefaultCloseOperation (jframe.exit_on_close);}} Preste atención a los cambios en la parte media del código, desde las 6 líneas de código originales, ahora se puede implementar 1 línea. Esta es una forma simple de expresión lambda.
Se puede ver que la sintaxis de la expresión de lambda es
(Param1, Param2, Param3) -> {// tODO}El programa tipo del parámetro aquí se puede inferir en función del contexto, pero no se puede inferir todos los tipos. En este momento, necesitamos mostrar el tipo de parámetro declarado. Cuando solo hay un parámetro, los soportes se pueden omitir. Cuando la parte TODO solo tiene una línea de código, se pueden omitir los aparatos óseicos en el exterior. Como en nuestro ejemplo anterior
Entonces, además del código conciso, ¿la expresión de Lambda nos trae algún cambio?
Recordemos que en Java, no podemos pasar una función como parámetro a un método, ni podemos declarar que el valor de retorno es un método de una función. Antes de Java 8, la respuesta fue sí.
Entonces, en el ejemplo anterior, en realidad podemos pasar una lógica de código como parámetro para el oyente, diciéndole al oyente que puede hacer esto cuando se active el evento, sin la necesidad de usar clases internas anónimas como parámetros. Esta es también otra característica nueva presentada por Java 8: Programación funcional.
Hay muchos idiomas que admiten la programación funcional. En JavaScript, es muy común aprobar las funciones como parámetros o valores de retorno como funciones. JavaScript es un lenguaje funcional muy común.
Lambda agrega características de programación funcional faltantes a Java, lo que nos permite tratar las funciones como ciudadanos de primera clase.
En los lenguajes de programación funcional, el tipo de expresión de Lambda es una función. En Java, las expresiones lambda son objetos, y deben estar conectados a un tipo de objeto especial: interfaz funcional.
A continuación, veamos la definición de la interfaz funcional:
Si hay y solo un método abstracto en una interfaz (los métodos en la clase de objeto no están incluidos), entonces esta interfaz puede considerarse como una interfaz funcional.
@FunctionalInterfacePublic Interface Runnable {/** * Cuando se usa una interfaz de implementación de objeto <code> runnable </code> * para crear un subproceso, iniciar el hilo hace que el método * <code> run </code> del objeto se llame en ese hilo de ejecución por separado. * <p> * El contrato general del método <code> ejecutar </code> es que puede * tomar cualquier acción. * * @see java.lang.thread#run () */ public abstract void run ();}Echemos un vistazo a la declaración de la interfaz ejecutable. Después de Java 8, la interfaz Runnable tiene una anotación adicional de interfaz funcional, lo que indica que la interfaz es una interfaz funcional. Sin embargo, si no agregamos la anotación de la interfaz funcional, si existe y solo un método abstracto en la interfaz, el compilador también considerará la interfaz como una interfaz funcional.
@FunctionalInterfacePublic Interface MyInterface {void test (); Cadena toString ();}MyInterface también es una interfaz funcional, porque ToString () es un método en la clase de objetos, pero se reescribe aquí y no aumentará el número de métodos abstractos en la interfaz.
(Para mencionar aquí, en Java 8, los métodos en la interfaz no solo pueden tener métodos abstractos, sino que también tienen métodos implementados específicos. Se denominan métodos predeterminados, que se introducirán en detalle más adelante)
Dado que en Java, las expresiones lambda son objetos. Entonces, ¿cuál es el tipo de este objeto? Revisemos el programa SwingTest, donde se crea una instancia de interfaz de ActionListener en una clase interna anónima.
jButton.AddActionListener (new ActionListener () {@Override public void ActionPerformed (ActionEvent E) {System.out.println ("¡Botón presionado!");}});Mejorado con la expresión de lambda
jButton.AddactionListener (e -> System.out.println ("¡Botón presionado!"));Es decir, usamos la expresión de Lambda para crear una instancia de la interfaz ActionListener, y luego observamos la definición de la interfaz ActionListener.
Public Interface ActionListener extiende EventListener { /*** invocado cuando ocurre una acción. */ public void ActionPerformed (ActionEvent E);} Solo hay un método abstracto. Aunque no se agrega la anotación de la interfaz funcional, también se ajusta a la definición de una interfaz funcional. El compilador considerará que esta es una interfaz funcional.
Por lo tanto, el uso de expresiones lambda puede crear instancias de interfaces funcionales. Es decir, la expresión de Lambda devuelve un tipo de interfaz funcional.
De hecho, hay tres formas de crear instancias de interfaz funcional (consulte la anotación funcional Interface):
1. Expresiones de Lambda
2. Cita de método
3. Referencia del método del constructor
Resumir
Lo anterior se trata de este artículo sobre la simple comprensión de Java 8 de las expresiones lambda e interfaces funcionales. Espero que sea útil para todos. Los amigos interesados pueden continuar referiéndose a otros temas relacionados en este sitio. Si hay alguna deficiencia, deje un mensaje para señalarlo.