Java8 新特性——Lambda 表达式(1)

       Lambda 表达式(Lambda expression)是一个匿名函数,基于数学中的λ演算得名,也可称为闭包(Closure)。现在很多语言都支持 Lambda 表达式,如 C++、C#、Java、 Python 和 JavaScript 等。Lambda 表达式是推动 Java 8 发布的重要新特性,它允许把函数作为一个方法的参数(函数作为参数传递进方法中)

      下面通过例 1 来理解 Lambda 表达式的概念 :

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);
    }
}

Java8 新特性——Lambda 表达式(1)_第1张图片

      这是经典OOP实现样式。下面我们对上面的代码做一个修改,创建一个功能接口,并对该接口定义抽象方法。  

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);
    }
}

Java8 新特性——Lambda 表达式(1)_第2张图片

        至此我们都尚未使用lambda表达式。我们仅创建了Printer接口的具体实现,并将其传递给printSomething 方法。下面将使用lambda表达式重构一下上面的代码。

Java8 新特性——Lambda 表达式(1)_第3张图片

关于lambda表达式的语法:

形参列表=>函数体(函数体多于一条语句的可用大括号括起)  在Java里就是() -> {}

(param1,param2,param3 ...,paramN)-  > {   //代码块;  }
  • lambda表达式,表达的是接口函数
  • 箭头左侧是函数的逗号分隔的形式参数列表
  • 箭头右侧是函数体代码
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);
    }
}

当然这两种写法是完全一样的:

Printer printer = (String toPrint)->{System.out.println(toPrint);};
Printer printer = System.out::println;

Java8 新特性——Lambda 表达式(1)_第4张图片

        lambda表达式使我们代码更简洁。实际上使用lambda表达式在性能和多核处理还有更多的好处,但是只有在理解java8 Streams API之后它们才有意义,因此不在本文讨论范围之内。

        对比传统java代码的实现方式,代码量是不是减少了很多?但这仍然不是最简的实现方式,我们一步一步来。

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);
  • 即使没有在箭头的左侧指定参数的类型,编译器也会从接口方法的形式参数中推断出其类型
  • 当只有一个参数的时候,我们完全可以省略参数的括号
  • 当函数体只有一行的时候,我们完全可以省略函数体花括号

如果我们的接口方法定义不带任何参数,则可以用空括号替换:

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

那么,我们最终通过lambda表达式,简化完成的代码是什么样的呢?庐山真面目:


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

        我们使用lambda表达式内联为函数调用参数,将最初main方法的9行代码下降到只有3行。但笔者要说,这仍然不是lambda表达式可以完成的最终极代码简化方式,当你学习了java8 Stream API结合lambda表达式使用,你会发现你的编码效率将大幅度提高。
 

你可能感兴趣的:(Java后端,java,开发语言,后端)