Java 为什么会引入lambda ?

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

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

构造线程:

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

public static void main(String[] args) {
myThread t = new myThread(); } class myThread implements Runnable {
@Override
public 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>() {
@Override
public 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代价小的太多了。

Java 8 为什么会引入lambda 表达式?的更多相关文章

  1. JAVA8初探-让方法参数具备行为能力并引入Lambda表达式

    关于JAVA8学习的意义先来贴一下某网站上的对它的简单介绍:“Java 8可谓Java语言历史上变化最大的一个版本,其承诺要调整Java编程向着函数式风格迈进,这有助于编写出更为简洁.表达力更强,并且 ...

  2. 【Java8新特性】你知道Java8为什么要引入Lambda表达式吗?

    写在前面 这是一道真实的面试题,一个读者朋友出去面试,面试官竟然问他这样一个问题:你说说Java8中为什么引入Lambda表达式?引入Lambda表达式后有哪些好处呢?还好这个朋友对Java8早有准备 ...

  3. Java 8新特性-3 Lambda 表达式

    在 Java 8 之前,匿名内部类,监听器和事件处理器的使用都显得很冗长,代码可读性很差. 在Java 8 之前使用匿名内部类: 例如 interface ITestPrint{ public voi ...

  4. Java编程的逻辑 (91) - Lambda表达式

    ​本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http: ...

  5. Java之线程池和Lambda表达式

    线程池和lambda表达式 学习线程池和lambda表达式的理解 补充一个知识点(单例设计模式) 在多线程中,我们只需要一个任务类,为了防止创建多个任务类,这个时候就需要用到单例模式,单例模式有两种设 ...

  6. Java :一文掌握 Lambda 表达式

    本文将介绍 Java 8 新增的 Lambda 表达式,包括 Lambda 表达式的常见用法以及方法引用的用法,并对 Lambda 表达式的原理进行分析,最后对 Lambda 表达式的优缺点进行一个总 ...

  7. 恕我直言你可能真的不会java第1篇:lambda表达式会用了么?

    本文配套教学视频:B站观看地址 在本号之前写过的一些文章中,笔者使用了lambda表达式语法,一些读者反映说代码看不懂.本以为java 13都已经出了,java 8中最重要特性lambda表达式大家应 ...

  8. Java 的各种内部类、Lambda表达式

    内部类 内部类是指在一个外部类的内部再定义一个类.内部类的出现,再次打破了Java单继承的局限性. 内部类可以是静态 static 的,也可用 public,default,protected 和 p ...

  9. [Java] 设计模式:代码形状 - lambda表达式的一个应用

    [Java] 设计模式:代码形状 - lambda表达式的一个应用 Code Shape 模式 这里介绍一个模式:Code Shape.没听过,不要紧,我刚刚才起的名字. 作用 在应用程序的开发中,我 ...

随机推荐

  1. Netty使用Google Protocol Buffer完成服务器高性能数据传输

    一.什么是Google Protocol Buffer(protobuf官方网站) 下面是官网给的解释: Protocol buffers are a language-neutral, platfo ...

  2. 00ff00 颜色信息

    RGB 0, 255, 0 百分比 0.0%, 100.0%, 0.0% 十六进制 00ff00 十进制 65280 二进制 00000000,11111111,00000000 CMYK 100.0 ...

  3. codewars[7]-python Friend or Foe?

    list中保留四字母的,然后return. 解 def friend(x): i = len(x) ii = [] a = 0 while a < i: if len(x[a]) == 4: i ...

  4. JavaScript数组高性能去重解决方案

    在大多数的人眼里,数组去重是一个很简单的课题,很多人甚至熟练掌握了多种数组去重的方法,然而大多时候,我们却忽略了数组去重所消耗的时间资源.譬如我们在做前端性能优化的时候,又有多少人会考虑JavaScr ...

  5. github项目readme.md文件如何编写

    参考链接:http://blog.csdn.net/Bone_ACE/article/details/48318675

  6. 优化 Ubuntu

    优化Ubuntu 1. 更换 apt 源 echo 'deb http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe mul ...

  7. (12)ASP.NET Core 中的配置二(Configuration)

    1.内存配置 MemoryConfigurationProvider使用内存中集合作为配置键值对.若要激活内存中集合配置,请在ConfigurationBuilder的实例上调用AddInMemory ...

  8. html+css+dom补充

    补充1:页面布局 一般像京东主页左侧右侧都留有空白,用margin:0 auto居中,一般.w. <!DOCTYPE html> <html lang="en"& ...

  9. 基于python的Elasticsearch索引的建立和数据的上传

    这是我的第一篇博客,还请大家多多指点 Thanks ♪(・ω・)ノ         今天我想讲一讲关于Elasticsearch的索引建立,当然提前是你已经安装部署好Elasticsearch. ok ...

  10. MySQL 之 Explain 输出分析

    ​MySQL 之 Explain 输出分析 背景 前面的文章写过 MySQL 的事务和锁,这篇文章我们来聊聊 MySQL 的 Explain,估计大家在工作或者面试中多多少少都会接触过这个.可能工作中 ...