zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    angular 前端路由不生效解决方案
    LinqMethod 实现 LeftJoin
    Newtonsoft.Json 序列化踩坑之 IEnumerable
    Newtonsoft.Json 指定某个属性使用特定的时间格式
    [svc]Linux中Swap与Memory内存简单介绍
    [svc]Linux vmstat命令实战详解
    [svc]ansible自动化模块
    [svc]ssh+gg二步认证
    [svc][cpu][jk]cpu的核心查看及什么是cpu的负载
    [vt][xen]xenserver初始安装增加第二块硬盘&xen图形界面安装vm&设置xen里vm开机启动
  • 原文地址:https://www.cnblogs.com/ryjJava/p/12293226.html
Copyright © 2011-2022 走看看