目录

  • Lambda表达式
    • 概念
    • 应用
      • 在forEach()方法使用
      • 用来替代匿名内部类
        • 代码验证(Lambda表达式替代匿名内部类)

Lambda表达式

概念

语法形式: () -> {}
组成:

  1. 括号:表示参数列表;
  2. 箭头:表示lambda运算符,读作goes to;
  3. 花括号:表示方法体。

参数列表相关概念:

参数个数:
无参数,或者,1个或多个;
另外,只有一个参数时括号可以省略。

参数的类型:
一般不定义参数类型,由编译器推理得到,或者特殊情况下,可以自己指定这些参数的类型。

方法体:
方法体中可以放参数相关的多句执行语句,也可以有return语句,当代码语句只有一句时,花括号可以省略。不在方法体中定义新的方法。有待考证*1

应用

在forEach()方法使用

Arrays.asList(1, 2, 3, 4, 5).forEach(x -> System.out.println(x));

用来替代匿名内部类

1、继承式匿名内部类如下:

new “类名”(){}

Lambda表达式代替:无法替代。有待考证*2
匿名内部类的花括号内是空的,对应Lambda表达式花括号内也是空的,但会【报错】Not a statement。说明不能是空的,得有执行语句。

2、接口式匿名内部类如下:

new “接口名”(){//重写这个父类“接口名”的一些或全部方法public 返回类型 方法名(参数类型 参数){//代码执行语句}
}

Lambda表达式代替:

  1. 当接口只有一个方法时,重写方法只有一个时,Lambda表达式可以成功代替。
(参数)->{//重写方法对应的代码执行语句
}
  1. 当接口只有多个方法时,即重写方法有多个时,Lambda表达式无法按上述1中格式:把每个重写方法的执行语句写上。
    【报错】:Multiple non-overriding abstract methods found in interface test.CarFun。

有待考证*3:是不是我不知道接口多个方法时,Lambda表达式的替换接口式匿名内部类的方法。

代码验证(Lambda表达式替代匿名内部类)

代码示例:

接口CarFun.java:

main函数验证:Test.java

下图在main函数下写了接口式匿名内部类。并用zerocarfun调用了drive()和stop()方法。接下来要写一个Lambda表达式替换它。

  1. Lambda表达式只重写一个方法drive()情况下:

    对应上图,替换成Lambda表达式后,执行代码结果:
zero开车了,已经开了0.7928757329649554千米

说明替换成功了。

  1. Lambda表达式重写drive()和stop()多个方法情况下:
    先打开CarFun中第5行代码注释。

    CarFun接口添加stop()方法后。【报错】:在CarFun接口中找到多个非重写的抽象方法。

在Lambda表达式里添加stop()方法的执行语句:

System.out.println("zero停车了");


仍然【报错】:在CarFun接口中找到多个非重写的抽象方法。

不知道如何用Lambda表达式替代,有多个方法的接口式匿名内部类。

考证*3:
百度一下报错信息。
知道:@FunctionalInterface会告诉编译器可以用Lambda表达式。
我很好奇这个是什么注解?我在接口上写了这个注解。
也【报错】:在CarFun接口中找到多个非重写的抽象方法。

我点进源码,查看了这个注解的概述。猜猜我发现了什么?我发现了一个关键句子:

Conceptually, a functional interface has exactly one abstract method.

从概念讲,一个functional interface有且仅有一个抽象方法。

进一步百度functional interface。
发现这个是函数式接口的意思。
结合上面百度到的:@FunctionalInterface会告诉编译器可以用Lambda表达式。

说明:Lambda表达式替换接口式匿名内部类时,这个匿名内部类相对应的接口只能有一个抽象方法。

结论:Lambda表达式替代接口式匿名内部类时,相对应的接口是一个函数式接口。

进一步,查看Predicate源码时发现,函数式接口只有一个抽象方法,但可以有多个default修饰的非抽象的方法,或者非抽象的静态方法。

考证*2:
进一步百度,了解,Lambda表达式替代匿名内部类,指就是上述结论中的情况,替代接口式匿名内部类,不是替代继承式匿名内部类。

考证*1:
从替代接口式匿名内部类角度看:花括号方法体中不定义新的方法,也不写方法名,直接写重写的代码执行语句即可。

有待进一步考证*1

Lambda表达式及应用相关推荐

  1. Lambda 表达式基础理论与示例

    Lambda 表达式基础理论与示例 Lambda 表达式,也可称为闭包,推动 Java 8 发布的最重要新特性. Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中). 使用 Lam ...

  2. lambda表达式树

    一.定义: 表达式树又称为表达式目录树,以数据形式表示语言级代码.所有的数据都存储在树结构中,每个结点表示一个表达式(Expression). 二.要点: –Lambda表达式的参数类型可以忽略,因为 ...

  3. java 8 lambda reduce_JDK8新特性Lambda表达式体验

    "Lambda 表达式"(lambda expression)是一个匿名函数,Lambda表达式基于数学中的λ演算得名,直接对应于其中的lambda抽象(lambda abstra ...

  4. java saf_Java 8 Lambda表达式探险

    为什么? 我们为什么需要Lambda表达式 主要有三个原因: > 更加紧凑的代码 比如Java中现有的匿名内部类以及监听器(listeners)和事件处理器(handlers)都显得很冗长 &g ...

  5. lamda表达式python_Python--13 lambda表达式

    python 允许使用lambda表达式来创建匿名函数 lambda表达式 >>>def ds(x): ... return 2 * x +1 ... >>> ds ...

  6. C++11:Lambda表达式(匿名函数)理解

    C++在C11标准中引入了匿名函数,即没有名字的临时函数,又称之为lambda表达式.lambda表达式 实质上是创建一个匿名函数/对象.即你可以理解为(Lambda 表达式实际上是一个函数,只是它没 ...

  7. java8 lambda 表达式详解

    lambada 表达式实质上是一个匿名方法,但该方法并非独立执行,而是用于实现由函数式接口定义的唯一抽象方法 使用 lambda 表达式时,会创建实现了函数式接口的一个匿名类实例 可以将 lambda ...

  8. Java8中Lambda表达式的10个例子

    Java8中Lambda表达式的10个例子  例1 用Lambda表达式实现Runnable接口 Java代码   //Before Java 8: new Thread(new Runnable() ...

  9. 【读书笔记】Lambda表达式

    Lambda表达式,是一个匿名函数,它可以包含表达式和语句,并且可用于创建委托或表达式目录树类型. Lambda表达式, 都是用"=>"运算符. 读作"goes t ...

  10. 【C++】lambda 表达式

    1.lambda 表达式 1.1 lambda 特点 lambda表示一个可调用单元,可视为内联函数 范式 : 具有一个返回类型,一个参数列表,一个函数体 [captrue list](paramet ...

最新文章

  1. ElasticSearch基础知识整理
  2. 如何表示int的最大值
  3. 《第一行代码》学习笔记16-碎片Fragment(1)
  4. halcon知识:【1】二维码原理
  5. LibSVM使用记录 C++ Visual studio
  6. 项响琴C语言书籍在线浏览,电子琴 c语言程序
  7. 心脏为什么长在左边?原来是因为这个消失的器官
  8. 行为模式之备忘录模式
  9. 前台html基础标签7.6
  10. 【LOJ】#2230. 「BJOI2014」大融合
  11. 精通~Scrum为什么会转型困难
  12. AutoCAD批量提取坐标点的三种方法
  13. 项目管理的方法论 一
  14. 全志A64 Android6.0编译
  15. 学生兼职工资被拖欠,如何用法律手段追回血汗钱?
  16. Camera360 一款强大的手机拍照必备软件
  17. The nested type test2 cannot hide an enclosing type
  18. Photoshop脚本开发环境
  19. FedNCF:Federated Neural Collaborative Filtering | 联邦神经协同过滤
  20. 拆解金融科技Q3业绩:增长、迭代与飞轮效应

热门文章

  1. 4.3/4.4 磁盘分区
  2. 浏览器兼容问题 透明度 position:fixed bootstrap
  3. LNMP/LEMP(PHP7.0.04+mysql5.7.12+nginx1.10.0)
  4. 【SICP练习】22 练习1.28
  5. Log4cpp 使用手册
  6. 两个精彩的比喻:吞吐量和延迟、信号量和互斥锁
  7. I must be strong and carry on
  8. python自带的编辑器怎么换行_Python3基础 print 自带换行功能
  9. python的urllib四大模块_Python常用的内建模块4:urllib
  10. mysql blob 比较_与MSSQL对比学习MYSQL的心得(四)--BLOB数据类型