• 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

  • 相关阅读:
    Thinkphp整合最新Ueditor编辑器
    git管理和自动部署项目
    [转]桶
    Linux下ThinkPHP网站目录权限设置
    ThoughtWorks FizzBuzzWhizz 代码实现
    windows bat脚本实现ftp自动下载 删除
    MCM/ICM2018美国大学生数学建模大赛D题翻译
    解决C/C++语言中全局变量重复定义的问题
    使用fabric解决百度BMR的spark集群各节点的部署问题
    解决百度BMR的spark集群开启slaves结点的问题
  • 原文地址:https://www.cnblogs.com/ryjJava/p/12293226.html
Copyright © 2020-2023  润新知