lambda表达式是一个可以传递的代码块,可以在以后执行一次或多次。
表达形式:(param)->{do something;},
如果没有param,需要保留“()”;
如果可以推到一个lambda表达式的参数类型,则可以忽略其他类型;
如果方法只有一个参数,而且这个参数的类型可以推导得出,那么甚至还可以省略小括号;
无需指定lambda表达式的返回类型,返回类型总是会由上下文推导得出。
对于只有一个抽象方法的接口,需要这种接口的对象时,就可以提供一个lambda表达式。这种接口被称为函数式接口(functional interface),
java.util.function包中定义了很多非常通用的函数式接口。
引用方法的时候,可以使用如下的语法:
object::instanceMethod;
Class::staticMethod;
Class::instanceMehtod.
前两种情况引用等价于提供方法参数的lambda表达式,例如下面两种方式。
Timer t1=new Timer(1000,event->System.out.print(event)); Timer t2=new Timer(1000,System.out::println));
第3种情况中,第1个参数会成为方法的目标。例如,String::compareToIgnoreCase等同于(x,y)->x.compareToIgnoreCase(y)。
也可以使用this。例如,this::equals等同于x->this.equals(x)。
子类调用父类方法的时候,可是使用super::instanceMethod。
表示lambda表达式的数据结构必须存储自由变量的值,只能引用值不会改变的变量,
即lambda表达式中捕获的变量必须实际上是最终变量(effectively final),这个变量初始化后就不会再为它赋新值,
因为对于多线程,如果引用的变量变化是很危险的。
lambda表达式的体与嵌套快有相同的作用域。这里同样适用于命名冲突和遮蔽的有关规则。
在一个lambda表达式中使用this关键字时,是指创建这个lambda表达式的方法的this参数。