Lambda表达式
格式: ()->{}
- 表达式如果只有一句话,可以不用{},也不能用{};
- 无需指定返回类型,会由上下文推导而得;
- lambda表达式要么每一个分支都需要有返回值,要么每一个分支都没有返回值;
- 如果表达式只有一个参数,可以省略();
- lambda表达式内部可以捕获外部变量的值,但这个值必须是最终变量,即不能改变;
- 在lambda表达式中声明一个与局部变量同名的的变量或参数是不合法的;
- 在一个lambda表达式中使用this关键字,是指创建这个lambda表达式的方法的this参数,即这个类的this;通过this对成员变量的操作修改是允许的。(说简单点就是在使用和普通正常的在方法中使用this没有区别)
函数式接口:对于只有一个抽象方法的接口,需要这种接口的对象时,就可以提供一个lambda表达式。这种接口称为函数式接口
比如Comparator
接口只有一个compare()
方法,因此它是一个函数式接口;
当使用Arrays.sort(数组,实现comparator接口的实例)
方法时,第二个参数可以直接用lambda
表达式的代码块
方法引用
例如
System.out::println 等价于 x->System,out.println(x)
Math::pow 等价于 (x,y)-> Math.pow(x,y)
- object::instanceMethod
- Class::staticMethod
- Class::instanceMethod
前两种方法引用等价于提供方法参数的lambda表达式。
第三种情况,第一个参数会成为方法的目标
例如
String::compareToIgnoreCase 等价于 (x,y)->x.compareToIgnoreCase(y)