lambda表达式
lambda表达式的语法
(type1 arg1, type2 arg2, ...) -> { /*代码块*/ }
不过在各种情况下可以有各种简写:
- 参数类型可以省略,系统会根据上下文来判断参数类型,就像这样
(arg1,arg2, ...) -> { /*代码块*/ }
- 当只有一个参数的时候,()也可以不写,就像这样
arg -> { /*代码块*/ }
- 当只有一条语句的时候,{}可以不写,就像这样
arg -> System.out.println(arg)
- 当没有参数的时候,()是需要写的,就像这样
() -> { /*代码块*/ }
使用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的代码块中不能调用接口的默认方法。