lambda表达式是一个可传递的代码块,可以在以后执行一次或多次。
lambda表达式的语法:
1. 参数 -> 表达式(无需指定返回类型)
(String first, String second)
-> first.length() - second.length()
2. 如果代码要完成的计算无法放在一个表达式中,可以把代码放在{}中
(String first, String second)
->
{
if (first.length() < second.length()) return -1;
else if (first.length() > second.length()) return 1;
else return 0;
}
3. 即使lambda表达式没有参数,仍然要提供空括号
() -> { for(int i=0; i>=0;i--) System.out.println(i); }
4. 如果可以推导出表达式的参数类型,则可以忽略其类型
Comparator
= (first, second) //编译器可以推导出first和second必然是字符串
-> first.length()-second.length();
5. 如果方法只有一个参数,而且这个参数的类型可以推导得出,那么也可以省略小括号
ActionListener listener = event ->
System.out.println("The time is " + new Date());
函数式接口:对于只有一个抽象方法的接口,需要这种接口的对象时,就可以提供一个lambda表达式。
1. Arrays类的sort方法的第二个参数需要一个Conparator实例。
Arrays.sort (pianets, (first , second) -> first.lengthO - second.lengthO) ;
方法引用:
1. Timer t = new Timer(1000, event -> System.out.println(event)):
Timer t = new Timer(1000, Systei.out::println);
表达式 System.out::println 是一个方法引用( method reference ), 它等价于 lambda 表达式
x -> System.out.println(x)
用:: 操作符分隔方法名与对象或类名。主要有 3 种情况:
(1) object::instanceMethod 例如, this::equals 等同于 x-> this.equals(x) super::instanceMethod
(2) Class::staticMethod 例如:Math::pow 等价于(x,y) -> Math.pow(x, y)
(3) Class.instanceMethod
lambda表达式可以捕获外围作用域中变量的值,但是只能引用值不会改变的变量,lambda捕获的变量必须是最终变量。