定义

lambda表达式是一个可以传递的代码块,可以在以后一次或多次执行,也就是它会延迟执行,等待某个时刻或者某个事件发生在执行。它类似于一个方法的实现。

语法

(String f, String s) -> f.length()-s.length();

以上就是一个lambda表达式,类似与方法,圆括号中定义参数,箭头后面的就是方法的具体实现。

  1. 如果lambda表达式的体(可以理解成方法体)包含多条语句则用{}括起来。
  2. lambda表达式中也可以使用return,但是如果表达式中有多个分支语句那么每个分支语句都必须要有return,否则不合法。
  3. 如果可以根据上下文推导出lambda表达式参数的类型,那么不需要指定参数类型。如下:可以推导出参数类型为String。
 Comparator<String> comp = (f,s) -> f.length()-s.length();
  1. 如果只有一个参数并且能推导出参数类型,则可以省略圆括号,如下。
 Comparator<String> comp = s -> System.out.println(s);
  1. lambda表达式不需要指定返回类型,因为其总是会有上下文推导得出。

函数式接口

  在真正了解lambda表达式前,我们需要先了解另外一个概念,它叫函数式接口。什么是函数接口呢?只有一个抽象方法的接口就是函数式接口,需要这种接口的对象时我们就可以给他提供一lambda表达式。
  这里需要注意一个点,接口类型的变量可以引用实现了该接口的类的对象,类似于父类类型的变量可以引用子类类型的对象(多态),接口类似于父类。那么当把lambda表达式赋给一个函数式接口的变量时,这个lambda表达式就会转化成为实现了该接口的对象,并且这个lambda表达式就是对这个函数式接口中唯一的抽象方法的实现。当我们用这个函数式接口的变量去调用这个唯一的抽象方法时(这时抽象方法已经被lambda表达式实现),执行的就是lambda表达式代码块。简单来讲lambda表达式就是对一个类实现了一个接口,然后把这个类的对象赋给接口变量,接口变量就可调用被实现的方法的这过程的简化,只是这里的接口必须是函数式接口。
  函数式接口类型的变量会接受一个实现了该接口的对象,而lambda表达式就可以转化为这样的一个对象,在这个对象上调用函数式接口中的唯一抽象方法执行的就是lambda表达式的体。
  lambda表达式能做的也只是转换为函数式接口。不能把lambda表达式赋给其他类型的变量,Object的变量也不可以,因为Object不是函数式接口。

  当我们使用lambda表达式时,要谨记表达式的用途,并给他建立一个特定的函数式接口,java.util.function包中包含了很多Java自带的通用的函数式接口,从这也可以理解函数式接口是用来传递lambda表达式的。

变量作用域

public void repeat(String s){ActionListener actionListener = e -> {System.out.println(s);};}

  可以看到上面的lambda表达式访问repeat方法中的局部变量(参数)s,但是有个问题我们需要考虑就是lambda表达式不是立即执行的,是在今后某个时刻或者某个事件发生后执行一次或多次,那就有可能repeat方法执行完了,lambda表达式还没有执行,当lambda表达式要执行了,这个时候局部变量s已经不再内存中了,这就会出错。所以在这里Java中对这种变量的访问增加一些限制。

  首先来了解下lambda表达式的构成,由三部分构成:

  1. 一个参数列表
  2. 一个代码块
  3. 自由变量的值,这是指不在参数以及代码块中定义的变量。

  以上的例子中变量s就是一个自由变量,lambda表达式的数据结构会存储这个自由变量的值,这个过程也称为捕获。lambda表达式在赋给一个函数式接口的变量时会被转化为包含一个方法的对象,该方法就是函数式接口中的唯一抽象方法,方法体就是lambda表达式代码块,那么这个自由变量就是这个对象的实例字段。

  有了lambda表达式对自由变量值的捕获后,就算这个变量在他自己的作用域中已经消失了,但是lambda表达式自己存储了一份,就不会出错。

注意

  lambda表达式中只能访问不在发生改变的变量,也就是事实最终变量,不一定要把这个变量声明为final,只要自己能确认不会再去改变它。这里的改变是既不能在lambda表达式中对其进行改变,也不能在lambda表达式外进行改变。

  lambda表达式与嵌套块有相同的作用域,同样适用命名冲突和遮蔽的规则。比如在lambda表达式中声明与局部变量同名的变量是不合法的。

什么是lambda表达式?lambda表达式详解相关推荐

  1. Java中Lambda表达式使用及详解

    Java中Lambda表达式使用及详解 前言 一.Lambda表达式的简介 Lambda表达式(闭包):java8的新特性,lambda运行将函数作为一个方法的参数,也就是函数作为参数传递到方法中.使 ...

  2. el表达式ne什么意思_JSP中EL表达式的用法详解(必看篇)

    EL 全名为Expression Language EL 语法很简单,它最大的特点就是使用上很方便.接下来介绍EL主要的语法结构: ${sessionScope.user.sex} 所有EL都是以${ ...

  3. Java Web中的EL(表达式语言)详解

     Java Web中的EL(表达式语言)详解 表达式语言(Expression Language)简称EL,它是JSP2.0中引入的一个新内容.通过EL可以简化在JSP开发中对对象的引用,从而规范页面 ...

  4. 学习ES6(六)--函数 Lambda函数(=) 详解

    函数是可读,可维护和可重用代码的构建块.使用function关键字定义功能.以下是定义标准函数的语法. function function_name() { // function body } 要强 ...

  5. 神经网络的函数表达式,神经网络公式详解pdf

    1.神经网络的准确率是怎么计算的? 其实神经网络的准确率的标准是自己定义的. 我把你的例子赋予某种意义讲解: 1,期望输出[1 0 0 1],每个元素代表一个属性是否存在.像着4个元素分别表示:是否肺 ...

  6. EL表达式 JSTL(详解)

    相关JSTL.EL博客收集如下: JSTL 标签大全详解:http://blog.csdn.net/qq_25827845/article/details/53311722 EL表达式详解:http: ...

  7. C语言:表达式求值详解

    文章目录 前言 一.隐式类型转换 二.算术转换 三.操作符的属性 前言 该篇文章是笔者之前一篇文章C语言操作符详解的后续补充: 表达式求值的顺序一部分是由操作符的优先级和结合性决定. 同样,有些表达式 ...

  8. C程序语言表达式运算顺序,详解C++编程中表达式的语义与计算顺序

    表达式根据其运算符的优先级和分组来计算. 计算顺序请看以下示例: // expre_pluslang__pluslang_Order_of_Evaluation.cpp // compile with ...

  9. 定时器表达式各组成部分详解

    2019独角兽企业重金招聘Python工程师标准>>> 一个Quartz的CronTrigger表达式分为七项子表达式,其中每一项以空格隔开,从左到右分别是:秒,分,时,月的某天,月 ...

  10. java数据类型_Java 变量、表达式和数据类型详解

    数据类型 一.变量 变量: 表示存储空间,可用来存放某一类型(整数.小数...)的数据,没有固定值,变量值是可变的,可重复使用,也可以用来存储某种类型的未知数据. 变量的特点: ① 占据内存中的一块存 ...

最新文章

  1. perl 命令行小记
  2. centos7 + VMware Workstation Pro
  3. css 水平垂直居中那些事
  4. LIS 的 n*log 算法 ———二分维护
  5. 虚拟机系列 | 执行引擎和垃圾回收
  6. Spring 访问数据库
  7. while循环random结合_Python程序控制结构 | 循环结构
  8. MS DOS窗口进入JAVA源程序,从java程序运行MS-DOS命令
  9. 阿里官宣AI框架大牛贾扬清加盟,任职技术VP
  10. SQL SERVER 跟踪调优书籍
  11. ubuntu-安装qt+gdb-imagewatch
  12. arduino 读取串口信息hex_进阶教程1:Arduino串口通信与电脑控制LED
  13. java发送带附件的邮件_Java发送邮件(带附件)
  14. 什么是CDN加速服务器?
  15. windowsPE制作工具
  16. Android实现获取未接来电和未读短信数量的方法
  17. java画板_java 画板画图程序
  18. 自家小程序 如何实现定点跳转其他(比如:京东,天猫,淘宝)的小程序的具体店铺
  19. 手机端H5页面边框缺失问题解决
  20. 广电总局要求所有视频网站TV端APP下架

热门文章

  1. 浅谈java集合类以及示例
  2. org.apache.http.impl.client 如何请求 HTTPS 的接口?
  3. vue刷新页面如何保证路由不变_vue通过路由实现页面刷新的方法
  4. 实现获取阿里云STS上传token
  5. 实战:云开发·实现奶茶店小程序(一)
  6. 电商用户行为分析大数据平台
  7. 2009年6月6日大学散伙饭--maybe大学最后一记
  8. 各种主板进入bios的方法汇总
  9. android comparable接口,考虑实现Comparable接口
  10. 省标准配置初中计算机室,初中实验室和功能室配备标准.doc