Lambda 表达式,也可称为闭包,它是推动 Java 8 发布的最重要新特性。使用 Lambda 表达式可以使代码变的更加简洁紧凑。坦白的说,初次看见Lambda表达式瞬间头就大了,为了更好的理解,我们可以把Lambda 表达式当作是一种匿名函数(对 Java 而言这并不完全正确,但现在姑且这么认为),简单地说,就是没有声明的方法,即没有访问修饰符、返回值声明和名字。
Lambda 表达式的结构
Java 中的 Lambda 表达式通常使用 (argument) -> (body) 语法书写,例如:
(arg1, arg2...) -> { body }
(type1 arg1, type2 arg2...) -> { body }

Lambda 表达式的结构说明:
  • 一个 Lambda 表达式可以有零个或多个参数
  • 参数的类型既可以明确声明,也可以根据上下文来推断。例如:(int a)与(a)效果相同
  • 所有参数需包含在圆括号内,参数之间用逗号相隔。例如:(a, b) 或 (int a, int b) 或 (String a, int b, float c)
  • 空圆括号代表参数集为空。例如:() -> 42
  • 当只有一个参数,且其类型可推导时,圆括号()可省略。例如:a -> return a*a
  • Lambda 表达式的主体可包含零条或多条语句
  • 如果 Lambda 表达式的主体只有一条语句,花括号{}可省略。匿名函数的返回类型与该主体表达式一致
  • 如果 Lambda 表达式的主体包含一条以上语句,则表达式必须包含在花括号{}中(形成代码块)。匿名函数的返回类型与代码块的返回类型一致,若没有返回则为空
列举几个 Lambda 表达式的例子:
(int a, int b) -> {  return a + b; }
() -> System.out.println("Hello World");
(String s) -> { System.out.println(s); }
() -> { return 3.1415 };

函数式接口
函数式接口是只包含一个抽象方法声明的接口。java.lang.Runnable 就是一种函数式接口,在 Runnable 接口中只声明了一个方法 void run(),我们使用匿名内部类来实例化函数式接口的对象,有了 Lambda 表达式,这一方式可以得到简化。看一下Java 8之前的runnable实现方法,需要4行代码,而使用lambda表达式只需要一行代码。
// Java 8之前:
new Thread(new Runnable() {@Overridepublic void run() {System.out.println("Before Java8, too much code for too little to do");}
}).start();
//Java 8方式:
new Thread( () -> System.out.println("In Java8, Lambda expression rocks !!") ).start();
@FunctionalInterface 是 Java 8 新加入的一种接口,用于指明该接口类型声明是根据 Java 语言规范定义的函数式接口。Java 8 还声明了一些 Lambda 表达式可以使用的函数式接口,当你注释的接口不是有效的函数式接口时,可以使用 @FunctionalInterface 解决编译层面的错误。
下面写一个自定义的函数式接口:
//定义一个函数式接口
@FunctionalInterface
public interface WorkerInterface {public void doSomeWork();
}
public class WorkerInterfaceTest {
public static void execute(WorkerInterface worker) {worker.doSomeWork();
}
public static void main(String [] args) {//invoke doSomeWork using Annonymous classexecute(new WorkerInterface() {@Overridepublic void doSomeWork() {System.out.println("Worker invoked using Anonymous class");}});//invoke doSomeWork using Lambda expression execute( () -> System.out.println("Worker invoked using Lambda expression") );
}
}

使用lambda表达式对列表进行迭代
要遍历数组中的所有元素,通常使用for循环的方法,而使用 Lambda 表达式的方法不止一种。在下面的例子中,我们先是用常用的箭头语法创建 Lambda 表达式,之后,使用 Java 8 全新的双冒号(::)操作符将一个常规方法转化为 Lambda 表达式:
//Java 8之前:
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7);
for(Integer n: list) {System.out.println(n);
}
//Java 8之后:
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7);
list.forEach(n -> System.out.println(n));
// 使用Java 8的方法引用更方便,方法引用由::双冒号操作符标示,
// 看起来像C++的作用域解析运算符
list.forEach(System.out::println);
Lambda表达式对比匿名类
使用匿名类与 Lambda 表达式的一大区别在于关键词的使用。匿名类的 this 关键字指向匿名类,而lambda表达式的 this 关键字指向写就 Lambda 的外部类。另一个不同点是二者的编译方式。Java编译器将lambda表达式编译成类的私有方法。使用了Java 7的 invokedynamic 字节码指令来动态绑定这个方法。

参考:

http://blog.oneapm.com/apm-tech/226.html
http://www.importnew.com/16436.html

Java 8 Lambda 表达式解析相关推荐

  1. Java 8 Lambda 表达式解析 1

    Lambda 表达式,也可称为闭包,它是推动 Java 8 发布的最重要新特性.使用 Lambda 表达式可以使代码变的更加简洁紧凑.坦白的说,初次看见Lambda表达式瞬间头就大了,为了更好的理解, ...

  2. 10个Java 8 Lambda表达式经典示例

    Java 8 刚于几周前发布,日期是2014年3月18日,这次开创性的发布在Java社区引发了不少讨论,并让大家感到激动.特性之一便是随同发布的lambda表 达式,它将允许我们将行为传到函数里.在J ...

  3. Java 8 Lambda 表达式详解

    版权声明:本文由吴仙杰创作整理,转载请注明出处:https://segmentfault.com/a/1190000009186509 1. 引言 在 Java 8 以前,若我们想要把某些功能传递给某 ...

  4. Java 8 Lambda 表达式被编译成了什么?

    点击上方"朱小厮的博客",选择"设为星标" 后台回复"书",获取个gui 在了解了Java 8 Lambda的一些基本概念和应用后, 我们会 ...

  5. Java 8 Lambda表达式10个示例【存】

    PS:不能完全参考文章的代码,请参考这个文件http://files.cnblogs.com/files/AIThink/Test01.zip 在Java 8之前,如果想将行为传入函数,仅有的选择就是 ...

  6. Java 8 Lambda表达式-接口实现

    Java 8 Lambda表达式在只有一个方法的接口实现代码编写中,可以起到简化作用: (argument list) -> body 具体看Runnable接口的例子 public class ...

  7. 这是一个有趣的问题,Java 8 Lambda 表达式被编译成了什么?

    在了解了Java 8 Lambda的一些基本概念和应用后, 我们会有这样的一个问题: Lambda表达式被编译成了什么? 这是一个有趣的问题,涉及到JDK的具体的实现.本文将介绍OpenJDK对Lam ...

  8. java 8 lambda表达式中的异常处理

    文章目录 简介 处理Unchecked Exception 处理checked Exception 总结 java 8 lambda表达式中的异常处理 简介 java 8中引入了lambda表达式,l ...

  9. 设计模式的Java 8 Lambda表达式–命令设计模式

    在本博客中,我将说明如何使用Java 8 Lambda表达式以函数式编程方式实现命令模式 . 命令模式的目的是将请求封装为对象,从而为具有不同请求,队列或日志请求的客户端参数化,并支持相应的操作. 命 ...

最新文章

  1. zynq7020安装linux图形界面,ZYNQ开发板的NFS文件系统安装 - ZYNQ7020学习
  2. SSM Generator生成mapper中xml文件:未能解析映射资源:“文件嵌套异常
  3. MySQL之流程控制
  4. 天人感应是常见的自然规律
  5. 9个前端常用的数据可视化库
  6. 2021年中国传统文化锦集(中国人必须了解的)
  7. 拥有“中国诺贝尔奖”的未来论坛,会告诉我们怎样的未来? | 未来论坛 2017...
  8. 【数字信号调制】基于ASK+OOK+BPSK+8PSK+QPSK+AM多种算法实现信号调制解调含Matlab源码
  9. Visual SourceSafe Explorer界面出现乱码+字体翻转
  10. 没有鸿蒙HarmonyOS,用这个软件也可以实现华为的多屏协助互动!
  11. matlab实现正割法求根和Aitken加速方法
  12. php 删除文件 unlink,php 删除文件函数unlink及删除文件夹示例
  13. 美术绘画之原画场景深入刻画-张聪-专题视频课程
  14. 多说最近访客通用代码使用方法
  15. VS2019+OpenCV配置
  16. GD32串口接收字符串总结
  17. 武汉理工计算机与自动化专业哪个好,武汉理工大学电气工程及其自动化专业怎么样...
  18. mootools_MooTools或jQuery的性感专辑封面
  19. php 卡号生成,生成卡号php代码
  20. 华为云早报 “会思考”的红绿灯来了!

热门文章

  1. 推荐7本EEG领域值得阅读的书籍
  2. eeglab中文教程系列(17)-DIPFIT对独立成分进行等价偶极子定位
  3. 关卡设计快速入门_6. 执行构建过程
  4. 为衣服添加NFC功能:挥下袖子就能安全支付,打开车门坐进去就能启动汽车|Nature子刊...
  5. 2021人工智能年度评选报名即将截止,3大类别6大奖项等你申报
  6. 1.75万亿参数、在国产超算上训练,刚刚智源发布了全球最大预训练模型“悟道2.0”...
  7. 中文预训练模型ZEN开源,效果领域内最佳,创新工场港科大出品
  8. 说人话教AI打游戏,Facebook开源迷你版星际争霸,成果登上NeurIPS 2019
  9. 环信-获取未读消息数量
  10. 视频直播营销时代已来,企业该如何把握这波红利?