Java8新特性之Lambda表达式

(一) Lambda表达式初探

Lambda表达式也可以称为闭包,它是java8最重要的特性之一。Lambda允许把函数作为一个方法的参数使用。使用Lambda表达式可以使我们的代码变得更加简洁紧凑,其实Lambda表达式的本质是一个“语法糖”,由编译器推断并转换为常规的代码,因此可以使用更少的代码来实现同样的功能。

Lambda表达式的格式:

(parameters) -> expression
(parameters) -> ( statements; )

Lambda表达式一些重要的特征如下:
1、可选类型声明:不需要声明参数类型,编译器可以统一识别参数值
2、可选的参数圆括号:当只有一个参数的时候,无须定义圆括号,但如果有多个参数时需要定义圆括号
3、可选的大括号:如果主体包含了一个语句、就不需要使用大括号
4、可选的返回关键字:如果主体只有一个表达式返回值则编译器会自动返回值

Lambda表达式常见的书写方式:

//不需要参数,返回值为5
() -> 5
//接收一个参数(数值类型),返回其2倍的值
x -> 2 * x
//接收两个参数(数值类型),并返回两者的差值
(x,y) -> x -y
//接收两个int类型的参数,返回两者的和
(int x,int y) -> x + y
//接收一个string对象,并在控制台打印,不返回任何值
(String s) -> System.out.print(x) 

举例如下:

/**
 * @create 2019/10/28
 * @since 1.0.0
 */
public class Java8LambdaDemo {
     
    public static void main(String[] args) {
     
        Java8LambdaDemo lambdaDemo = new Java8LambdaDemo();
        //类型声明
        Calculator addition = (int a, int b) -> a + b;
        //不用类型声明
        Calculator substraction = (a, b) -> a - b;
        //大括号中的返回语句
        Calculator multiplication = (int a, int b) -> {
     return a * b;};
        //没有大括号及返回语句
        Calculator division = (int a, int b) -> a / b;
        //测试
        System.out.println("100 + 50 = " + lambdaDemo.operate(100, 50, addition));
        System.out.println("100 - 50 = " + lambdaDemo.operate(100, 50, substraction));
        System.out.println("100 * 50 = " + lambdaDemo.operate(100, 50, multiplication));
        System.out.println("100 / 50 = " + lambdaDemo.operate(100, 50, division));
    }

    /**
     * 运算接口
     */
    interface Calculator {
     
        int calculate(int a, int b);
    }

    /**
     * 操作方法
     * @param a
     * @param b
     * @param calculator
     * @return
     */
    private int operate(int a,int b,Calculator calculator){
     
        return calculator.calculate(a,b);
    }
}

结果如下
Java8新特性之Lambda表达式_第1张图片

(二)Lambda表达式作用域

可以直接在Lambda表达式中访问外层的局部变量,但在Lambda表达式内部不能修改定义在Lambda表达式外部的局部变量,否则会编译报错,Lambda表达式的局部变量可以不用声明为final,但是必须不可被后面的代码修改,即隐性的具有final的语义,在lambda表达式当中不允许声明一个与外部变量同名的参数或者局部变量

/**
 * @create 2019/10/28
 */
public class Java8LambdaScopeDemo {
     
    public static void main(String[] args) {
     
        final String salutation = "Hello";
        String myName = "I am Lambda";
        String today = "2019/10/28";
        SayHello greetingService = message -> {
     
            System.out.println(salutation + message + myName);
        };
        greetingService.say(" World! ");
    }
    interface SayHello {
     
        void say(String message);
    }
}

Java8新特性之Lambda表达式_第2张图片

你可能感兴趣的:(JavaSE)