java8引入Lamabda
表达式,目前我个人认为就是为了简化代码,使得逻辑更加的清晰。
理论上,java8
之前不能解决的,使用Lamabda
也不能解决。
Lamabda会根据赋值的上下文、方法调用的上下文和类型转换的上下文中获得目标类型。(这里的上下文指的是参数和返回值)。
语法
基本语法:
(parameters)-> expression
或
(parameters)-> {statements;}
表达式不需要花括号,语句需要花括号,并且还有分号。
局部变量限制
这里的限制也和匿名方法使用局部变量一样,必须要求其被final
修饰。
为什么呢?
第一、实例变量和局部变量背后的实现有一个关键不同。实例变量都存储在堆中,而局部变量则是存储在栈中。如果Lamabda
可以直接访问局部变量,而且Lamabda
是在一个线程(我们暂时叫为线程A)中使用的,那么使用Lamabda
的线程(也就是线程A),可能会在分配该变量的线程(我们暂时叫线程B)将这个变量收回之后,去访问该变量。因此,Java在访问自由局部变量时,实际上是在访问它的副本,而不是访问原始变量。如果局部变量仅仅赋值一次的话,那就没有什么区别啦!——–所以有了这样的限制。这个和匿名方法是一样的。
第二、这一限制不鼓励你使用改变外部变量的典型命令式编程模式。