lambda表达式

lambda表达式的语法

(type1 arg1, type2 arg2, ...) -> { /*代码块*/ }

不过在各种情况下可以有各种简写:

  1. 参数类型可以省略,系统会根据上下文来判断参数类型,就像这样(arg1,arg2, ...) -> { /*代码块*/ }
  2. 当只有一个参数的时候,()也可以不写,就像这样arg -> { /*代码块*/ }
  3. 当只有一条语句的时候,{}可以不写,就像这样arg -> System.out.println(arg)
  4. 当没有参数的时候,()是需要写的,就像这样() -> { /*代码块*/ }

使用lambda的地方

lambda的目标类型(或者简单的说,lambda的类型)是函数式接口(所谓函数式接口就是,只含有一个抽象方法的接口),所以lambda表达式可能会在下面几种情况下使用到:
1.作为函数式接口类型的参数传给某个方法,就像这样new Thread(() -> { /*代码块*/ }).start();
2.赋值给某个函数式接口类型的变量,像这样Runnable r = () -> { /*代码块*/ };
3.使用函数式接口对lambda表达式进行强制类型转换,这样Object obj = (Runnable) () -> { /*代码块*/ };

lambda和匿名内部类的联系

1.lambda表达式和匿名内部类一样可以访问局部变量(final修饰的),以及外部类的成员变量
2.lambda表达式和匿名内部类一样,创建的对象可以调用接口的默认方法。

lambda和匿名内部类的区别

1.lambda表达式只能为函数接口(即只有一个抽象方法的接口)创建实例,而匿名函数则没有什么限制。
2.匿名类实现的抽象方法体中可以调用接口的默认方法,但是lambda的代码块中不能调用接口的默认方法。

猜你喜欢

转载自www.cnblogs.com/yi-hui/p/8973775.html