01. Java8-Lambada 表达式

x33g5p2x  于2021-12-18 转载在 其他  
字(2.0k)|赞(0)|评价(0)|浏览(302)

lambda 表达式可以算是java8 最大的新特性了, Lambda 表达式其实就是匿名内部类的简单实现方式, 去掉了匿名内部类的模板式代码, 只保留匿名内部类中抽象方法的核心代码, 使代码看起来更简洁. lambda 表达式需要函数式接口支持, 适用于策略设计模式. 此外, java8 增强了类型推断, 可以通过目标方法上下文推断参数类型. 对于同级别局部变量在匿名内部类中使用时,无须再显示声明final, 但底层依旧是final 类型, lambda表达式中不能修改.

1. Lambada 语法格式

java8 引入了一个新的操作符 -> , 称为箭头操作符或Lambda操作符. 箭头将lambda表达式分为左右两部分:

  • 左侧: Lambada 表达式的参数列表, 相当于匿名内部类中抽象方法的参数
  • 右侧: Lambada 表达式的方法体, 相当于匿名内部类中抽象方法的方法体
参数列表 -> 方法体
(参数) -> {方法体}

2. Lambda 表达式常见语法格式

lambda 表达式的参数个数, 方法体语句行数的差异, lambda 表达式提供了相应的简写方式,因此也就产生了多种多样的lambda 表达式格式.

  • 当只有一个参数时, 参数列表的括号可以省略. 但是当没有参数或者多个参数的时候,括号均不能省略.
  • 当方法体只有一行语句时, 方法体的大括号也可以省略
  • 当方法体只有一行return 语句时, return 也可以省略
  • 参数类型也可以省略,通常也是省略的.java8 自身会根据上下文进行类型推断.
  • lambda 其实就是匿名内部类的一种语法糖, 为了方便开发人员开发代码.

2.1 无参数, 无返回值

@Test
public void test_1(){
    Runnable runnable = () -> System.out.println(LocalDateTime.now());
    runnable.run();
}

2.2 有一个参数, 无返回值

@Test
public void test_2(){
    Consumer<String> consumer = (name) -> System.out.println(name);
    consumer.accept("zhangsan");

    // 左侧只有一个参数时, 小括号可以不写. 当无参数或多个参数时,都必须写.
    Consumer<String> consumer1 = name -> System.out.println(name);
    consumer1.accept("lisi");
}

2.3 有一个参数, 有返回值

@Test
public void test_3(){
    Function<Employee, String> function = (employee -> employee.getName());

    Employee emp = new Employee(1001, "zhangsan", "Man", 20);
    String name = function.apply(emp);
    System.out.println(name);
}

2.4 有一个参数, 多条语句,无返回值

@Test
public void test_4(){
    // lambda 体中多条语句时,使用大括号包裹, 使用return 返回值
    Comparator<Integer> intCmp = (x, y) -> {
        System.out.println("x:" + x + ",y:" + y);
        return Integer.compare(x, y);
    };
    System.out.println(intCmp.compare(3, 5));

    // 当lambda 体中只有一条语句时, 大括号和return 都可以省略
    Comparator<Double> doubleCmp = (x, y) -> Double.compare(x, y);
    System.out.println(doubleCmp.compare(3.0, 5.0));

}

2.5 省略参数类型, java8来做类型推断

@Test
public void test_5(){

    // 完整写法, 不省略大小括号和return
    BinaryOperator<Long> biOper = (Long x, Long y) -> {
        return x + y;
    };
    System.out.println("10 + 20 = " + biOper.apply(10l, 20l));

    // 省略大括号, 参数类型, return
    BinaryOperator<Long> biOper2 = (x, y) -> x + y;
    System.out.println("10 + 20 = " + biOper2.apply(10l, 20l));

相关文章