根据我的观察,Lambda是一种比较灵活的形式,需要多看几个案例才能明白它。

Lambda是一种简化代码的技术手段,主要用于简化匿名实现类,允许把函数作为一个方法的参数传递进方法中。它本身并不会创造出新的概念和功能来。不过现在很多开源项目都使用到这种技术,我的原则是能看懂别人代码即可。

Lamdba 优点:

如果你的代码中有地方需要接口回调套接口回调,有可能套了好几层,虽然这种情况出现的概率比较低,但是一旦出现这种代码,lambda表达式的这个简洁,就很适合这种场景。

Lamdba 缺点:

缺点也是它的简洁,由于省略了太多东西,代码可读性有可能在一定程度上会降低,这个完全取决于你使用lambda表达式的位置所设计的API是否被你的代码的其他阅读者所熟悉。

使用语法:

  1. (参数类型 参数名, 数参数类型 参数名2...) -> {
  2. // code
  3. };

没有参数的案例

传统写法:

  1. public static void general() {
  2. // 用匿名内部类的方式来创建线程
  3. new Thread(new Runnable() {
  4. @Override
  5. public void run() {
  6. System.out.println("Hello World.");
  7. }
  8. }).run();
  9. }

Lambda 写法:

  1. public static void lambda() {
  2. // 使用Lambda来创建线程
  3. new Thread(() -> System.out.println("Hello Lambda!")).run();
  4. }

有参数,有返回值的案例

1个参数,一个返回值

  1. public static void oneParam() {
  2. // Consumer<String> con = (s) -> System.out.println(s);
  3. // 参数的小括号可以省略。
  4. Consumer<String> con = s -> System.out.println(s);
  5. con.accept("oneParam Test!");
  6. }

2个参数,一个返回值

  1. interface Calculator {
  2. int calculate(int a, int b);
  3. }
  4. public class Main {
  5. public static void main(String[] args) {
  6. Calculator calculator = (a, b) -> a + b;
  7. int result = calculator.calculate(5, 3);
  8. System.out.println(result);
  9. }
  10. }

语法说明:

  • (a,b) 参数类型是可以省略的,编译器会根据上下文推断出参数类型。当然,这种省略并不是必须的,你也可以显式地指定参数类型;
  • a + b ,在Lambda表达式的主体中,如果主体只有一条表达式,那么这条表达式的结果将被隐式地作为Lambda表达式的返回值,并且这个大括号都是可以省略的。当然,你也可以使用了显式的return语句来返回结果。

和上面一样的代码,但是使用显示:

  1. interface Calculator {
  2. int calculate(int a, int b);
  3. }
  4. public class Main {
  5. public static void main(String[] args) {
  6. Calculator calculator = (int a, int b) -> {
  7. return a - b;
  8. };
  9. int result = calculator.calculate(5, 3);
  10. System.out.println(result);
  11. }
  12. }

函数式接口@FunctionalInterface

TODO

What is Lambda?的更多相关文章

  1. 你知道C#中的Lambda表达式的演化过程吗?

    那得从很久很久以前说起了,记得那个时候... 懵懂的记得从前有个叫委托的东西是那么的高深难懂. 委托的使用 例一: 什么是委托? 个人理解:用来传递方法的类型.(用来传递数字的类型有int.float ...

  2. Linq表达式、Lambda表达式你更喜欢哪个?

    什么是Linq表达式?什么是Lambda表达式? 如图: 由此可见Linq表达式和Lambda表达式并没有什么可比性. 那与Lambda表达式相关的整条语句称作什么呢?在微软并没有给出官方的命名,在& ...

  3. 背后的故事之 - 快乐的Lambda表达式(一)

    快乐的Lambda表达式(二) 自从Lambda随.NET Framework3.5出现在.NET开发者眼前以来,它已经给我们带来了太多的欣喜.它优雅,对开发者更友好,能提高开发效率,天啊!它还有可能 ...

  4. Kotlin的Lambda表达式以及它们怎样简化Android开发(KAD 07)

    作者:Antonio Leiva 时间:Jan 5, 2017 原文链接:https://antonioleiva.com/lambdas-kotlin/ 由于Lambda表达式允许更简单的方式建模式 ...

  5. Lambda

    Lambda Lambda 表达式是一种可用于创建委托或表达式目录树类型的匿名函数. 通过使用 lambda 表达式,可作为参数传递或作为函数调用值返回的本地函数. Lambda 表达式对于编写 LI ...

  6. 9、委托、事件、Lambda

    开始 关于委托,肯定是要有问题的. 第一个问题,委托用来干什么? 看.net中的表述:在.net平台下,委托类型用来定义和相应应用程序中的回调.(回调?处理内存中两个实体双向通信的一种技术.)   第 ...

  7. java8中lambda表达式的应用,以及一些泛型相关

    语法部分就不写了,我们直接抛出一个实际问题,看看java8的这些新特性究竟能给我们带来哪些便利 顺带用到一些泛型编程,一切都是为了简化代码 场景: 一个数据类,用于记录职工信息 public clas ...

  8. 搭建一套自己实用的.net架构(3)续 【ORM Dapper+DapperExtensions+Lambda】

    前言 继之前发的帖子[ORM-Dapper+DapperExtensions],对Dapper的扩展代码也进行了改进,同时加入Dapper 对Lambda表达式的支持. 由于之前缺乏对Lambda的知 ...

  9. 如何设计一门语言(七)——闭包、lambda和interface

    人们都很喜欢讨论闭包这个概念.其实这个概念对于写代码来讲一点用都没有,写代码只需要掌握好lambda表达式和class+interface的语义就行了.基本上只有在写编译器和虚拟机的时候才需要管什么是 ...

  10. Speedment -- 利用lambda编写SQL

    众所周知Java8中加入了lambda语法,这一特性也帮助Java开发者极大的简化了开发.Speedment是一个利用lambda表达式操作数据库的框架,相比Java世界中现在非常流行的mybatis ...

随机推荐

  1. 【园子资深博主直播】 冰蓝老师《ChatGPT 初探》

    AI对经济增长.经济周期.经济形态.社会就业都有着非常巨大的影响,ChatGPT4.0发布后,燃起了我们每一个开发人的激情和恐惧,但各路自媒体信息杂乱无序,缺少非常系统性的ChatGPT原理解读. 此 ...

  2. Python潮流周刊#7:我讨厌用 asyncio

    你好,我是猫哥.这里记录每周值得分享的 Python 及通用技术内容,部分为英文,已在小标题注明.(标题取自其中一则分享,不代表全部内容都是该主题,特此声明.) 首发于我的博客:https://pyt ...

  3. Devexpress如何获取RadioGroup选中项的值和显示值

    分享一个小技巧,如题目所示,DEV控件如何获取RadioGroup选中项的值和显示值.也是在网上找了很久,看了大家都是通过SelectIndex的值定位选中的按钮,并没有说取选中项的值,所以自己研究了 ...

  4. OOP第三阶段题目集总结|课程总结-22201608-柯汶君

      第三阶段的题目集时间跨度大,内容比较充实,对前面学习过的类的继承,多态,接口进行了巩固练习,加深我们对多态的理解,学会更好地改善代码的结构.同时对最后阶段所学习的集合框架体系(Set.Map等)比 ...

  5. [ARM 汇编]高级部分—系统控制协处理器—3.2.3 控制寄存器的读写操作

    在这一部分,我们将学习如何使用ARM汇编指令在系统控制协处理器(CP15)的控制寄存器上执行读写操作.我们将通过实例来讲解如何使用MCR(Move to Coprocessor Register)和M ...

  6. 从零开始整SpringBoot-搭建一个企业级项目

    创建Springboot项目 在企业里的项目多数是分Modules的,更多是通过物理方式隔离层之间的职责. 首先按照原有新建SpringBoot项目创建,填好相关信息后,选择Java 8其他不用选. ...

  7. FTL没有映射管理,跟上班没有钱有什么区别

    大家好,我是五月. 前言 FTL(Flash Translation Layer),即闪存转换层,是各种存储设备的核心算法,作用是将Host传下来的逻辑地址转换成物理地址,也就是映射. 可以说,地址映 ...

  8. 前端Vue自定义简单通用省市区选择器picker地区选择器picker 收获地址界面模版

    前端Vue自定义简单通用省市区选择器picker地区选择器picker 收获地址界面模版,下载完整代码请访问uni-app插件市场地址:https://ext.dcloud.net.cn/plugin ...

  9. XTTS系列之二:不可忽略的BCT

    重要系统Oracle数据库U2L迁移场景中,如果客户来问我建议,我都会回复说首选就是XTTS,除非XTTS经测试实在是无法满足停机窗口,否则就不要考虑OGG这类方案. 换句话说,选择OGG做迁移的场景 ...

  10. 【阅读笔记】低照度图像增强-《An Integrated Neighborhood Dependent...

    本文介绍的是一种比较实用的低照度图像增强算法,选自2004年Tao的一篇论文,名称是<An Integrated Neighborhood Dependent Approach for Nonl ...