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

原文地址:https://www.cnblogs.com/ryjJava/p/12293226.html