1. Gramática básica
Java8 introduce un nuevo operador "->" operador de flecha, el operador de flecha divide la expresión Lambda en dos partes
A la izquierda: la lista de parámetros de la expresión Lambda, correspondiente a la lista de parámetros del método abstracto.
Derecha: Funciones a realizar, correspondientes a funciones a implementar por métodos abstractos.
2. Consejos
Guarde un paréntesis entre izquierda y derecha, infiera el tipo a la izquierda,
3. Formato gramatical
Formato de sintaxis 1: sin parámetros, sin valor de retorno
() -> System.out.println ("Hola");
@Test public void test1 () { int num = 2; // Antes de jdk 1.7, debe ser final antes de que pueda ser invocado por el mismo nivel Runnable r = new Runnable () { @Override public void run () { System.out.println ( "Hola" + num); } }; r.run (); System.out.println ( "---------------------" ); // Usar Expresión lambda Runnable r2 = () -> System.out.println ("Hola Lambda" ); r2.run (); }
Formato de sintaxis 2: hay un parámetro, sin valor de retorno
@Test public void test2 () { Consumer <String> con = (x) -> System.out.println (x); con.accept ( "Hay un parámetro" ); }
Formato de sintaxis 3: si solo hay un parámetro, los paréntesis se pueden omitir sin escribir
@Test public void test2 () { Consumer <String> con = x-> System.out.println (x); con.accept ( "Hay un parámetro" ); }
Formato de sintaxis cuatro: hay dos parámetros, hay un valor de retorno y hay varias declaraciones en el cuerpo de Lambda
@Test public void test4 () { Comparator <Integer> com = (x, y) -> { System.out.println ("Interface funcional"); devuelve Integer.compare (x, y); }; }
Formato de sintaxis 5: hay dos parámetros, hay un valor de retorno y solo hay una declaración en el cuerpo de Lambda, no se puede devolver ni {}
@Test public void test5 () { Comparador <Integer> com = (x, y) -> Integer.compare (x, y); }
Formato de sintaxis 6: el tipo de datos en la lista de parámetros de la expresión Lambda puede omitirse o no escribirse,
Debido a que el compilador JVM deduce del contexto, el tipo de datos, es decir, "inferencia de tipo"
(Integer x,Integer y) -> Intrger.compare(x,y);
4. La expresión Lambda necesita soporte de "interfaz funcional"
Interfaz funcional: solo hay una interfaz de método abstracto en la interfaz, que se puede decorar con @FunctionalInterface.
// Interfaz, solo un parámetro, interfaz con
paquete de valores de retorno Clock; @FunctionalInterface public interface MyFun { public Integer getValue (Integer x); }
// Requisito: realizar una operación en un número @Test public void test7 () { Integer num = operation (100, x-> x * x); System.out.println (num); System.out.println (operation ( 200 , y-> y + 200 )); } operación pública Integer (número entero, MyFun my) { return my.getValue (num); }