Nuevas características de Java 8: expresiones Lambda (1)

       La expresión lambda es una función anónima, que lleva el nombre del cálculo lambda en matemáticas y también puede denominarse cierre. Muchos lenguajes ahora admiten expresiones Lambda, como  C++ , C# , JavaPython  y  JavaScript  . La expresión lambda es una nueva característica importante que promueve el lanzamiento de Java 8, que permite que las funciones se utilicen como parámetros de un método (las funciones se pasan a los métodos como parámetros)

      Entendamos el concepto de expresión Lambda a través del siguiente ejemplo:

public class LambdaDemo {
    //函数定义
    public void printSomething(String something) {
        System.out.println(something);
    }
    //通过创建对象调用函数
    public static void main(String[] args) {
        LambdaDemo demo = new LambdaDemo();
        String something = "I am learning Lambda";
        demo.printSomething(something);
    }
}

      Esta es una implementación clásica de programación orientada a objetos. A continuación, hacemos una modificación al código anterior, creamos una interfaz funcional y definimos métodos abstractos para la interfaz.  

public class LambdaDemo {
    //抽象功能接口
    interface Printer {
        void print(String val);
    }
    //通过参数传递功能接口
    public void printSomething(String something, Printer printer) {
        printer.print(something);
    }

    public static void main(String[] args) {
        LambdaDemo demo = new LambdaDemo();
        String something = "I am using a Functional interface";
        //实现Printer接口
        Printer printer = new Printer() {
            @Override
            public void print(String val) {
                //控制台打印
                System.out.println(val);
            }
        };
        demo.printSomething(something, printer);
    }
}

        Hasta ahora no hemos utilizado expresiones lambda. Solo creamos una implementación concreta de la interfaz de la Impresora y la pasamos al método printSomething  . A continuación, refactorizaremos el código anterior utilizando expresiones lambda.

Respecto a la sintaxis de expresiones lambda:

Lista de parámetros formales => cuerpo de la función (el cuerpo de la función se puede encerrar entre llaves si contiene más de una declaración). En Java, es () -> {} :

(param1,param2,param3 ...,paramN)-  > {   //代码块;  }
  • La expresión lambda expresa la función de la interfaz.
  • A la izquierda de la flecha está la lista de parámetros formales de la función separados por comas.
  • El lado derecho de la flecha es el código del cuerpo de la función.
package com.example.exceldemo.task;
public class LambdaDemo {
    //抽象功能接口
    interface Printer {
        void print(String val);
    }
    //通过参数传递功能接口
    public void printSomething(String something, Printer printer) {
        printer.print(something);
    }

    public static void main(String[] args) {
        LambdaDemo demo = new LambdaDemo();
        String something = "I am learning Lambda";
        //实现Printer接口(请关注下面这行lambda表达式代码)
        Printer printer = System.out::println;
        //调用接口打印
        demo.printSomething(something, printer);
    }
}

Por supuesto, estas dos formas de escribir son exactamente iguales:

Impresora impresora = (String toPrint)->{System.out.println(toPrint);};
Impresora impresora = System.out::println;

Reponer: 

       Después de Java 8, se agregó el ::operador de dos puntos dobles, que se utiliza para " referencia de método ". Tenga en cuenta que no es una llamada a un método. Aunque la "referencia de método" no utiliza directamente expresiones Lambda, también está relacionada con expresiones Lambda e interfaces funcionales. El formato de sintaxis de la referencia del método es el siguiente:

ObjectRef :: nombremétodo 

       Entre ellos, ObjectRef es el nombre de la clase o el nombre de la instancia, y MethodName es el nombre del método correspondiente.

       La referencia del método puede entenderse como un atajo para las expresiones Lambda: es más conciso, más legible y tiene buena reutilización que las expresiones Lambda. Si la implementación es relativamente simple y no hay muchos lugares para la reutilización, se recomienda utilizar expresiones Lambda; de lo contrario, se deben utilizar referencias de métodos.

        Las expresiones lambda simplifican nuestro código. De hecho, el uso de expresiones lambda tiene más beneficios en términos de rendimiento y procesamiento de múltiples núcleos, pero solo tienen sentido después de comprender la API de Java8 Streams, por lo que están fuera del alcance de este artículo.

        En comparación con la implementación del código Java tradicional, ¿se ha reducido mucho la cantidad de código? Pero esta todavía no es la forma más sencilla de implementarlo, así que vayamos paso a paso.

Printer printer = (String toPrint)->{System.out.println(toPrint);};
//简化:去掉参数类型
Printer printer = (toPrint)->{System.out.println(toPrint);};
//简化:去掉参数括号
Printer printer = toPrint->{System.out.println(toPrint);};
//简化:去掉函数体花括号
Printer printer = toPrint->System.out.println(toPrint);
  • Incluso si el tipo de parámetro no se especifica en el lado izquierdo de la flecha, el compilador inferirá su tipo a partir de los parámetros formales del método de interfaz.
  • Cuando solo hay un parámetro, podemos omitir completamente los paréntesis del parámetro.
  • Cuando el cuerpo de la función tiene solo una línea, podemos omitir completamente las llaves del cuerpo de la función.

Si nuestro método de interfaz está definido sin ningún parámetro, se puede reemplazar con corchetes vacíos:

()->  System.out.println("anything you wan to print")

Entonces, ¿cómo se ve el código que finalmente simplificamos mediante expresiones lambda? La verdadera cara del Monte Lu:


public static void main(String[] args) {
    LambdaDemo demo = new LambdaDemo();
    String something="I am Lambda";
    //关注下面的这行代码
    demo.printSomething(something, toPrint -> System.out.println(toPrint));
}

        Usamos expresiones lambda para insertar parámetros de llamada de función, reduciendo las 9 líneas de código originales en el método principal a solo 3 líneas. Pero el autor quiere decir que este todavía no es el método definitivo de simplificación de código que pueden lograr las expresiones lambda. Cuando aprenda la API Java8 Stream combinada con expresiones lambda, descubrirá que su eficiencia de codificación mejorará enormemente.
 

Supongo que te gusta

Origin blog.csdn.net/weixin_49171365/article/details/130157534
Recomendado
Clasificación