Java 为什么会引入lambda ?

在Java8出现之前,如果你想传递一段代码到另一个方法里是很不方便的。你几乎不可能将代码块到处传递,因为Java是一个面向对象的语言,因此你要构建一个属于某个类的对象,由它的某个方法来放置你想传递的代码块。

下面看两个非常典型的例子,构造线程与比较器:

构造线程:

我们要想在另一个线程中执行一些代码逻辑时,通常会将代码放在一个实现Runnable接口的run方法当中,如下图:

public static void main(String[] args) {myThread t = new myThread();}class myThread implements Runnable {@Overridepublic void run() {System.out.println("放入你想执行的代码");}
}

你写这段代码的目的就是想开启新的线程来执行你定制的代码,为此你创建了myThread

接着我们看下构造比较器:

public static void main(String[] args) {List<Integer> list = new ArrayList<>();list.add(2);list.add(5);list.add(1);list.add(4);list.add(3);Comparator<Integer> comparator = new Comparator<Integer>() {@Overridepublic int compare(Integer o1, Integer o2) {return o2 - o1;}};Collections.sort(list, comparator);
}

sort 方法会不断调用compare 方法,对顺序不对的元素进行重新排序,直到有序为止。你写比较器的目的就是给Collections的sort方法传递一段比较逻辑的代码片段,这段代码会被整合到排序排序逻辑中,为此你写了一个类和一个方法

上述两个例子你会看到它们的相似点,将一段代码传递给其他调用者(一个线程池或者一个排序方法),这段代码会在新的方法中被调用。

但是,在Java8出现之前,如果你想传递一段代码到另一个方法里是很不方便的,因为Java是一个面向对象的语言,因此你要构建一个属于某个类的对象,由它的某个方法来放置你想传递的代码块。而在一些其他语言中可以直接传递代码块,比如JS。为此,Java决定加入了lambda表达式的语法糖。

lambda改造

对于传入比较器代码块,我们的目的是想传入一段比较逻辑,利用lambda表达式可以:

lambda表达式的语法格式是:参数->一个表达式,如果想传入的代码无法用一个表达式表示,则可以用 参数->{多个表达式}。如果没有参数需要传递,则可以用()->表达式的形式。

public static void main(String[] args) {List<Integer> list = new ArrayList<>();list.add(2);list.add(5);list.add(1);list.add(4);list.add(3);Collections.sort(list, (one,two)->{System.out.println("one="+one);System.out.println("two="+two);return two - one;});}

编译器会解析出来 one 与 two 是原先接口compare方法的入参,并自动赋予Integer类型。

对于构造线程,我们的目的就是想传入一段线程执行的代码,利用lambda表达式可以这样做:

public static void main(String[] args) {new Thread(() -> {for (int i = 0; i < 100; i++) {System.out.println("这是一个线程" + i);}}).start();for (int i = 100; i < 200; i++) {System.out.println("这是主线程" + i);}
}

从上述的例子可以看出,有了lambda表达式,传递代码块变得更为简单,对于一些特定的使用场景,例如Steam API,lambda会大大提高你的代码效率,并且比传统的方式要更为易读(当然,前提是你知道lambda表达式的语法)。

总的来说,所有的lambda表达式都是延迟执行的,如果你希望立即执行一段代码,那就没必要使用lambda表达式了,延迟执行代码的原因有很多种:

  1. 在另一个线程中运行代码
  2. 多次运行代码
  3. 在某个算法的正确时间点上运行代码(如排序中的比较逻辑)
  4. 某些条件触发时运行代码(数据到达,接口回调等)

在实际工作中还是比较推荐大家使用的,有人可能会拿性能说事,但你想一想lambda表达的性能损耗可比查询一次MySQL代价小的太多了。

转载于:https://www.cnblogs.com/keeya/p/11404631.html

为什么Java需要lambda 表达式?相关推荐

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

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

  2. Java 8 Lambda 表达式详解

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

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

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

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

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

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

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

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

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

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

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

  8. Java 8 Lambda表达式的函数式编程– Monads

    什么是monad ?: monad是一种设计模式概念,用于大多数功能编程语言(如Lisp)或现代世界的Clojure或Scala中. (实际上,我会从scala复制一些内容.)现在,为什么它在Java ...

  9. 深入浅出 Java 8 Lambda 表达式

    摘要:此篇文章主要介绍 Java8 Lambda 表达式产生的背景和用法,以及 Lambda 表达式与匿名类的不同等.本文系 OneAPM 工程师编译整理. Java 是一流的面向对象语言,除了部分简 ...

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

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

最新文章

  1. 论文回顾:U2-Net,由U-Net组成的U-Net
  2. 计算机专业建设思路和措施,计算机网络专业教学改革与建设思路措施
  3. PHP str_word_count
  4. Java基础学习总结(10)——static关键字
  5. JS中for循环的两种写法
  6. PHP中error_reporting()用法详解
  7. 8字箴言:尊重、尽责、开放、创新
  8. FIR_01 基于FPGA的FIR滤波器 (FDATOOL ISE ) 第一篇:初步认识和应用
  9. Ubuntu16.04中php如何切换版本
  10. SkyEye图形化界面使用技巧篇(二)
  11. mac mysql 8.0.11安装_Mac下安装mysql8.0.11
  12. 分析数据包(Microsoft Visual Studio 2010)
  13. 125w短波通信距离_陕西烽火通信短波及超短波产品.doc
  14. Spark实用议题系列(02)--- DataFrame的各种join总结和实例
  15. 快手短视频怎么同步到头条?
  16. Java身份证校验算法
  17. 这个时间戒夜奶很合适, 错过了不仅宝宝会受伤害, 妈妈也会很累
  18. RAC - RACSignal
  19. 美国加州大学河滨分校陈雪梅教授北大招聘Co-PI
  20. 电脑重装系统word从第二页开始有页眉页脚如何设置

热门文章

  1. 平凡的世界,有感而发
  2. ajax方式下载文件
  3. appium 中部分 api 的使用方法
  4. UNITY录制视屏解决方案 - ShareREC For Unity3D
  5. [PHP] Laravel常见报错总结(持续更新)
  6. Unit Testing for WinForm
  7. 在Excel中制作复合饼图
  8. 我之我见:samba共享
  9. 跨域cookie传递
  10. [置顶] 分步实现具有分页功能的自定义DataList控件【附源代码】