5.1Java语言的Lambda表达式

Lambda 表达式(Lambda expression)可以被认为是一个匿名函数,即没有名称的方法,基于数学中的λ演算得名,也可称为闭包(Closure),它允许把函数作为一个方法的参数(函数作为参数传递进方法中)。

(参数列表) -> {
    // Lambda表达式主体
}

->被称为箭头操作符或 Lambda 操作符,箭头操作符将 Lambda 表达式拆分成两部分:

  • 可选类型声明:不需要声明参数类型,编译器可以统一识别参数值。
  • 可选的参数圆括号:一个参数无需定义圆括号,但多个参数需要定义圆括号。
  • 可选的大括号:如果主体包含了一个语句,就不需要使用大括号。
  • 可选的返回关键字:如果主体只有一个表达式返回值则编译器会自动返回值,大括号需要指定明表达式返回了一个数值。

示例1:

public class Calculator {
  
    interface IntegerMath {
        int operation(int a, int b);   
    }
  
    public int operateBinary(int a, int b, IntegerMath op) {
        return op.operation(a, b);
    }
 
    public static void main(String... args) {
    
        Calculator myApp = new Calculator();
        IntegerMath addition = (a, b) -> a + b;
        IntegerMath subtraction = (a, b) -> a - b;
        System.out.println("40 + 2 = " +
            myApp.operateBinary(40, 2, addition));
        System.out.println("20 - 10 = " +
            myApp.operateBinary(20, 10, subtraction));    
    }
}

该方法operateBinary对两个整数操作数执行数学运算。该操作本身由IntegerMath的实例指定。该示例使用lambda表达式additionsubtraction定义了两个操作。该示例输出以下内容:

40 + 2 = 42 
20-10 = 10

访问变量

Lambda表达式可以访问所在外层作用域内定义的变量,包括:成员变量和局部变量。

访问成员变量

成员变量包括:实例成员变量和静态成员变量。

在Lambda表达式中可以访问这些成员变量,此时的Lambda表达式与普通方法一样,可以读取成员变量,也可以修改成员变量。

示例代码如下:

//LambdaDemo.java文件
package com.a51work6;

public class LambdaDemo {
    // 实例成员变量
    private int value = 10;  
    // 静态成员变量
    private static int staticValue = 5;
    // 静态方法,进行加法运算
    public static Calculable add() {
        Calculable result = (int a, int b) -> {
        // 访问静态成员变量,不能访问实例成员变量
            staticValue++;
            int c = a + b + staticValue; // this.value;
            return c;
        };
        return result;
    }

    // 实例方法,进行减法运算
    public Calculable sub() { 
        Calculable result = (int a, int b) -> {
            // 访问静态成员变量和实例成员变量
            staticValue++;
            this.value++;
            int c = a - b - staticValue - this.value;
            return c;
        };
        return result;
    }
}

捕获局部变量

对于成员变量的访问Lambda表达式与普通方法没有区别,但是对于访问外层局部变量时,会发生“捕获变量”情况。Lambda表达式中捕获变量时,会将变量当成final的,在Lambda表达式中不能修改那些捕获的变量。

//LambdaDemo.java文件
package com.a51work6;

public class LambdaDemo {
    // 实例成员变量
    private int value = 10;
    // 静态成员变量
    private static int staticValue = 5;
    // 静态方法,进行加法运算
    public static Calculable add() {
        //局部变量
        int localValue = 20;
        Calculable result = (int a, int b) -> {
        // localValue++; //编译错误
        int c = a + b + localValue;
        return c;
        };
    return result;
    }

    // 实例方法,进行减法运算
    public Calculable sub() {
        //final局部变量
        final int localValue = 20;
        Calculable result = (int a, int b) -> {
            int c = a - b - staticValue - this.value;
            // localValue = c; //编译错误
            return c;
        };
        return result;
    }
}

原创文章,作者:huoxiaoqiang,如若转载,请注明出处:https://www.huoxiaoqiang.com/java/javabasic/2510.html

发表评论

登录后才能评论