JAVA8(一)Lambda表达式
1.Lambda基本语法
(parameters) -> expression (表达式,隐藏了return)
或
(parameters) -> {statements;}
2.局部变量
Lambda表达式运行使用自由变量(外层作用域中定义的变量)。Lambda可以捕获实例变量和静态变量,但局部变量必须显式声明为final。换句话说,Lambda表达式只能捕获指派给他们的局部变量一次(捕获实例变量可以被看作捕获最终局部变量this)。
为什么局部变量有限制?因为实例变量存储在堆中,而局部变量存储在栈上。如果Lambda可以直接访问局部变量,而且Lambda是在一个线程中使用,则使用Lambda的线程,可能会在分配该变量的线程将这个变量收回之后,去访问该变量。因此,java在访问自由局部变量时,实际上是在访问它的副本,而不是访问原始变量。这样会引发线程的不安全性。
3.方法引用
方法引用就是根据已有的方法实现来创建Lambda表达式,目标引用放在分隔符::前,方法的名称放在后面。
Lamba | 方法引用 |
(Apple a) -> a.getWeight() | Apple :: getWeight |
() -> Thread.currentThread().dumpStack() | Thread.currentThread() :: dumpStack |
(str,i) -> str.substring(i) | String::substring |
(String s) -> System.out.println(s) | System.out :: println |
方法引用主要有三类:
(1)指向静态方法的方法引用,如Integer的parseInt方法
(args) -> ClassName.staticMethod == ClassName :: staticMethod
(2)指向任意类型实例方法的方法引用,如String的length方法
(arg0,rest) -> arg0.instanceMethod(rest) == ClassName :: instanceMethod
(3) 指向现有对象的实例方法的方法引用
(args) -> expr.instanceMethod(args) == expr :: instanceMethodb