一页书

你永远不会过度准备

Lambda表达式

什么是Lambda表达式

Lambda表达式(也称为闭包)是Java 8中最大和最令人期待的语言改变。它允许我们将函数当成参数传递给某个方法,或者把代码本身当作数据处理。

Lambda的优点

简化匿名内部类的使用,语法更加简单。

Lambda标准格式

Lambda的标准格式由3个部分组成: 参数列表->方法体

(参数类型 参数名称) -> {
    代码体;
}

Lambda省略格式

  1. 小括号内 参数的类型 可以省略
  2. 如果小括号内 有且仅有一个参数 ,则 小括号 可以省略
  3. 如果大括号内 有且仅有一个语句 ,可以 同时 省略 大括号、return关键字及语句分号
// 假设有一个将list内容遍历的需求
List<String> list= Arrays.asList("a","b","c");
// Lambda标准格式 遍历
list.forEach((String e) -> {
   System.out.println(e);
});
// Lambda省略格式 遍历
list.forEach( e-> System.out.println(e) );

Lambda表达式可以引用类成员和局部变量(会将这些变量隐式得转换成final的),例如下列两个代码块的效果完全相同:

String separator = ",";
Arrays.asList( "a", "b", "d" ).forEach( e -> System.out.print( e + separator ) );

final String separator = ",";
Arrays.asList( "a", "b", "d" ).forEach( e -> System.out.print( e + separator ) );

Lambda的前提条件

Lambda的语法非常简洁,但是Lambda表达式不是随便使用的,使用时有几个条件要特别注意:

  1. 方法的参数或局部变量类型 必须为接口
  2. 这个接口中 有且仅有一个 抽象方法

Lambda 使用示例

//返回数组元素最大值
public class DemoLambda {
    // 一个有且仅有一个抽象方法的接口
    interface testInterface {
        int printMax();
    }
    // 方法的参数为接口
    private static void printMax(testInterface testInterface) {
        int max = testInterface.printMax();
        System.out.println("max = " + max);
    }

    public static void main(String[] args) {
        // 调用printMax,使用Lambda重写抽象方法
        printMax(() -> {
            int[] arr = {10, 20, 100, 30, 40, 50};
            // 先排序,最后就是最大的
            Arrays.sort(arr);
            return arr[arr.length - 1];
        });
    }
}

Lambda和匿名内部类对比

  1. 所需的类型不一样
    • 匿名内部类,需要的类型可以是类,抽象类,接口
    • Lambda表达式,需要的类型必须是接口
  2. 抽象方法的数量不一样
    • 匿名内部类所需的接口中抽象方法的数量随意
    • Lambda表达式所需的接口只能有一个抽象方法
  3. 实现原理不同
    • 匿名内部类是在编译后会形成class
    • Lambda表达式是在程序运行的时候动态生成class

当接口中只有一个抽象方法时,建议使用Lambda表达式,其他其他情况还是需要使用匿名内部类

0%