转载java 8 为什么引入 lambda
转载:https://www.cnblogs.com/keeya/p/11404631.html
java 8 为什么引入 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表达式的语法糖。
1|1lambda改造
对于传入比较器代码块,我们的目的是想传入一段比较逻辑,利用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表达的性能损耗可比查询一次MySQL代价小的太多了。
转载java 8 为什么引入 lambda的更多相关文章
- Java 8 为什么会引入lambda 表达式?
Java 8 为什么会引入lambda ? 在Java8出现之前,如果你想传递一段代码到另一个方法里是很不方便的.你几乎不可能将代码块到处传递,因为Java是一个面向对象的语言,因此你要构建一个属于某 ...
- Java 终于在 Java 8 中引入了 Lambda 表达式。也称之为闭包或者匿名函数。
本文首发于 blog.zhaochunqi.com 转载请注明 blog.zhaochunqi.com 根据JSR 335, Java 终于在 Java 8 中引入了 Lambda 表达式.也称之为闭 ...
- 浅析Java 8新特性Lambda Expression
什么是Lambda Expression 对于Lambda Expression,我的理解是,它是一个函数表达式,如下: (int x, int y) -> x - y 符号左边定义了函数的输入 ...
- Java核心技术-接口、lambda表达式与内部类
本章将主要介绍: 接口技术:主要用来描述类具有什么功能,而并不给出每个功能的具体实现.一个类可以实现一个或多个接口. lambda表达式:这是一种表示可以在将来的某个时间点执行的代码块的简洁方法. 内 ...
- Java基础教程:Lambda表达式
Java基础教程:Lambda表达式 本文部分内容引用自OneAPM:http://blog.oneapm.com/apm-tech/226.html 引入Lambda Java 是一流的面向对象语言 ...
- Java 8 (2) 使用Lambda表达式
什么是Lambda? 可以把Lambda表达式理解为 简洁的表示可传递的匿名函数的一种方式:它没有名称,但它有参数列表.函数主体.返回类型,可能还有一个可以抛出的异常列表. 使用Lambda可以让你更 ...
- java函数式编程之lambda表达式
作为比较老牌的面向对象的编程语言java,在对函数式编程的支持上一直不温不火. 认为面向对象式编程就应该纯粹的面向对象,于是经常看到这样的写法:如果你想写一个方法,那么就必须把它放到一个类里面,然后n ...
- 最全最强 Java 8 - 函数编程(lambda表达式)
Java 8 - 函数编程(lambda表达式) 我们关心的是如何写出好代码,而不是符合函数编程风格的代码. @pdai Java 8 - 函数编程(lambda表达式) 简介 lambda表达式 分 ...
- Java 函数式编程(Lambda表达式)与Stream API
1 函数式编程 函数式编程(Functional Programming)是编程范式的一种.最常见的编程范式是命令式编程(Impera Programming),比如面向过程.面向对象编程都属于命令式 ...
随机推荐
- visionpro和halcon这两款机器视觉软件区别
很多朋友会问到visionpro和halcon这两款机器视觉软件,到底学哪个好呢,今天重码网就给大家讲一讲: 首先比较下两者的优缺点: halcon: 提供的图像算法要比Visionpro多,也就是说 ...
- STL 大法好
#include <vector> 1.支持随机访问,但不支持在任意位置O(1)插入: 2.定义: ```cpp vector<int> a; ``` ...
- 03-Django模型类
ORM框架:对象-关系-映射 将面向对象语言程序中的对象自动持久化到关系数据库中.本质就是将数据从一种形式转换到另外一种形式O表示Object 对象类R表示Relations 关系,关系数据库中的表M ...
- codeforces 371 C-Hamburgers
一个乱七八糟的故事背景,可以练练英语阅读. 大概的意思是Polycarpus喜欢汉堡,现在他有你ns片香肠片,nb面包,nc块起司,有r卢布,每种东西都有价格,如果不够他可以去商店买(商店里面各种东西 ...
- Transformations 方块转换 USACO 模拟 数组 数学 耐心
1006: 1.2.2 Transformations 方块转换 时间限制: 1 Sec 内存限制: 128 MB提交: 10 解决: 7[提交] [状态] [讨论版] [命题人:外部导入] 题目 ...
- SWT 注意事项
一:GridData (1) 将 GridData 的 widthHint 设置为0,可以解决控件大小会随着这其默认值长度大小而改变的问题.
- 免安装版tomcat安装成服务
安装方式(前提已经安装好了jdk,并配置了环境量): (1) 下载非exe的tomcat zip包: (2) 解压缩,如:D:\tomcat: (3) 进入D:\tomcat\bin,修改servic ...
- Linux基础文件查找
一.文件查找 (一).命令文件 [root@linux ~]# chich ls //从PATH环境变量 [root@linux ~]# chereis vim [root@linux ~]# ech ...
- Go中的异常处理
1. errors包 Go 有一个预先定义的 error 接口类型 : type error interface { Error() string } 错误值用来表示异常状态.Go也提供了一个包:er ...
- 基于 kubeadm 部署单控制平面的 k8s 集群
单控制平面不符合 HA 要求,但用于开发/测试环境不会有任何问题,如果资源足够的话(10台以上服务器,3台用于APIserver.3台用于 etcd 存储.至少3台用于工作节点.1台作为负载均衡),可 ...