Java笔记:Lambda表达式

Lambda表达式在Java中是函数式编程的一种体现,允许把函数作为一个方法的参数传递进方法中,或者将函数作为方法的返回值。

1. 语法和基础使用

语法:

// Lambda实现是一个简单的表达式
(parameters) -> expression;
// Lambda实现是一个函数体
(parameters) -> {statements;}
  • parameters是参数列表,如果没有参数,则需要使用一个空括号 () -> ...
  • 如果只有一个参数,则可以不用括号 parameter -> ... (推荐),也可以使用括号 (parameter) -> ...
  • 如果有多个参数,则正常使用参数列表即可 (parameter1, parameter2, ...) -> ...
  • 由于java中对于Lambda表达式的类型推断机制,其中的parameter可以声明参数类型,也可以不用,如 (int parameter) -> ...

示例1:只有一个参数,函数主体是简单表达式。

List<String> names = Arrays.asList("zhangsan", "lisi", "wangwu");
// 单参数 + 简单表达式,也是将Lambda表达式作为函数传递给方法
names.forEach(name -> System.out.println(name));

示例2:使用Lambda表达式实现函数式接口,并作为参数传入方法。

public class Main {
    public static void main(String[] args) {
        // 使用Lambda表达式实现接口
        AddOperation addOperation = (a, b) -> System.out.println(a + b);
        // 执行对应的接口方法
        addOperation.operate(1, 2);
        // 将Lambda表达式作为参数传入方法
        Main.add_operate(3, 4, addOperation);
    }

    /**
     * 定义一个接口
     */
    interface AddOperation {
        void operate(int a, int b);
    }

    /**
     * 将接口作为参数类型
     */
    public static void add_operate(int a, int b, AddOperation addOperation) {
        addOperation.operate(a, b);
    }
}

函数式接口: 能用Lambda表达式实现的接口必须是函数式接口,即内部只有一个抽象方法的接口。可以使用注解@FunctionalInterface来标识该接口,如果该接口不满足函数式接口的定义则会报错,例如接口中有两个抽象方法。

2. 变量作用域

Lambda表达式中使用的局部变量,是隐式的final类型,即不可以在表达式后再修改该变量的值。以下示例会报编译错误:

public class Main {
    public static void main(String[] args) {
        int b = 1;
        // b为隐式的final类型,不允许在Lambda后面再修改b的值
        // 此处IDE会提示:variable used in lambda expression should be final or effectively final
        AddOperation addOperation = a -> System.out.println(a + b);
        b = 3;
        addOperation.operate(2);
    }

    /**
     * 定义一个接口
     */
    interface AddOperation {
        void operate(int a);
    }
}

Lambda表达式中的参数定义也不能和局部变量的参数名称同名,以下示例会报编译错误:

public class Main {
    public static void main(String[] args) {
        int b = 1;
        int c = 2;
        // 此处Lambda表示的参数b和局部变量的名称相同,编译会报错
        // IDE也会提示:Variable 'b' is already defined in the scope
        AddOperation addOperation = b -> System.out.println(b + c);
        addOperation.operate(2);
    }

    /**
     * 定义一个接口
     */
    interface AddOperation {
        void operate(int a);
    }
}

热门相关:北宋闲王   娇妻如云   萌妻太甜:总裁大人,别傲娇   护花猎王   唐朝贵公子