为什么使用Lambda表达式(翻译版)

简介
如上图所示,绿色框中就是Lambda表达式,是可以执行的代码块。Lambda表达式是很多编程语言的特征,比如Lisp, Python, Scala等。
但是对于java,在8以后才支持这种写法。在此之前,如果想执行一个代码块,我们需要新建一个对象,并传递这个对象,比如使用策略模式。java 8以后,可以把某个功能视为方法参数,并传递一个代码块。
对于java 8来说,Lambda表达式的凭借着自身的强大,而备受关注。
在本文中,我将简单地介绍下函数式编程在java 8中的运用。这是java 8 lambda系列的一部分。
1,java 8以前如何排序
下面将介绍如何使用 comparator 对自定义数组的排序。
- 需要被排序的类:Dog
public class Dog {
String name;
int height;
int weight;
public Dog(String n, int s, int w) {
this.name = n;
this.height = s;
this.weight = w;
}
public String toString() {
return getName() + ": size=" + getHeight() + " weight=" + getWeight()
+ " \n";
}
//setters and getters ...
}
- 国际惯例,为了排序这些狗子,打算使用
Arrays.sort(...),然而此方法第二个参数是一个比较器(comparator,下同),所以需要构造一个比较器,如下是一个利用策略模式的经典例子。
import java.util.Arrays;
import java.util.Comparator;
import java.util.stream.Stream;
public class ArraysSort {
public static void main(String[] args) {
Dog d1 = new Dog("Max", 2, 50);
Dog d2 = new Dog("Rocky", 1, 30);
Dog d3 = new Dog("Bear", 3, 40);
Dog[] dogArray = { d1, d2, d3 };
printDogs(dogArray);
Arrays.sort(dogArray, new Comparator<Dog>() {
@Override
public int compare(Dog o1, Dog o2) {
return o1.getWeight() - o2.getWeight();
}
});
printDogs(dogArray);
}
public static void printDogs(Dog[] dogs) {
System.out.println("--Dog List--");
for (Dog d : dogs)
System.out.print(d);
System.out.println();
}
}
2,通过Lambda表达式排序
- 在java 8,只要如下一行简单的代码实现
Arrays.sort(dogArray, (Dog m, Dog n) -> m.getWeight() - n.getWeight());
printDogs(dogArray);
(Dog m, Dog n) -> Integer.compare(m.getWeight(), n.getWeight())就是Lambda表达式。它被偷偷地转换成了比较器对象。我们可以暂时把lambda表达式简单地认为是一个方法。至于lambda表达式如何转成函数式接口是一个复杂的故事。
3,Lambda表达式的语法
语法包含一下几点:
- 以逗号分隔,以()关闭的形参:
(Dog m, Dog n) - 箭头标记:
-> - 主体部分则是一个单表达式或者声明代码块。如下是单表达式形式:
- Integer.compare(m.getWeight(), n.getWeight())
当然了,我们也能使用其他不同的方式去写lambda表达式的。
4,Stream 应用程序接口
为什么在java 8中,lambda表达式这么强大?Stream API起了很大作用。(注:stream不翻译)在java 8中,stream是支持顺序和并行聚合操作的元素序列。
通过使用streams,可以简单地通过一块代码去筛选,并将筛选功能应用于stream中的每一个元素。
对于上文的狗子排序,也通过stream实现,如下:
import java.util.stream.Stream;
public class Java8WhyLambda {
public static void main(String[] args) {
// create an array of dogs
Dog d1 = new Dog("Max", 2, 50);
Dog d2 = new Dog("Rocky", 1, 30);
Dog d3 = new Dog("Bear", 3, 40);
Dog[] dogArray = { d1, d2, d3 };
// use stream to sort
Stream<Dog> dogStream = Stream.of(dogArray);
Stream<Dog> sortedDogStream = dogStream.sorted((Dog m, Dog n) -> Integer.compare(m.getHeight(), n.getHeight()));
sortedDogStream.forEach(d -> System.out.print(d));
}
}
原文地址: Why do we need Lambda in Java?
为什么使用Lambda表达式(翻译版)的更多相关文章
- 解问 lambda表达式
目录 1.0 何为Lambda 1.1 Lambda语法特征 1.2 Lambda实例 1.3 Lambda中的stream 1.4 Lambda 中的 stream 效率 1.0 何为Lambda ...
- PHPExcel中文开发手册翻译版(1)
请注意这个是粗翻译版,仅供参考,不是精校版 精校版后面才会更新 英文原版在线文档 https://github.com/PHPOffice/PHPExcel/wiki/User%20Documenta ...
- C#中的委托,匿名方法和Lambda表达式
简介 在.NET中,委托,匿名方法和Lambda表达式很容易发生混淆.我想下面的代码能证实这点.下面哪一个First会被编译?哪一个会返回我们需要的结果?即Customer.ID=.答案是6个Firs ...
- (转)C#中的委托,匿名方法和Lambda表达式
简介 在.NET中,委托,匿名方法和Lambda表达式很容易发生混淆.我想下面的代码能证实这点.下面哪一个First会被编译?哪一个会返回我们需要的结果?即Customer.ID=5.答案是6个Fir ...
- 初探Lambda表达式/Java多核编程【0】从外部迭代到内部迭代
开篇 放假前从学校图书馆中借来一本书,Oracle官方的<精通Lambda表达式:Java多核编程>. 假期已过大半才想起来还没翻上几页,在此先推荐给大家. 此书内容及其简洁干练,如果你对 ...
- 初探Lambda表达式/Java多核编程【2】并行与组合行为
今天又翻了一下书的目录,第一章在这之后就结束了.也就是说,这本书所涉及到的新的知识已经全部点到了. 书的其余部分就是对这几个概念做一些基础知识的补充以及更深层次的实践. 最后两个小节的内容较少,所以合 ...
- Java8一:Lambda表达式教程
1. 什么是λ表达式 λ表达式本质上是一个匿名方法.让我们来看下面这个例子: public int add(int x, int y) { return x + y; } 转成 ...
- 看到他我一下子就悟了-- Lambda表达式
一直对Lambda表达式似懂非懂,平常也用过,就是不太明白有时候还要百度.周六去图书馆看书,看到下面这几句话,一下子就悟了: Lambda表达式(匿名函数),基本形式: (intput paramte ...
- easyui datagrid remoteSort的实现 Controllers编写动态的Lambda表达式 IQueryable OrderBy扩展
EF 结合easy-ui datagrid 实现页面端排序 EF动态编写排序Lambda表达式 1.前端页面 var mainListHeight = $(window).height() - 20; ...
随机推荐
- 008-Shell 流程控制
一.if else 1.1.if if 语句语法格式: if condition then command1 command2 ... commandN fi 写成一行(适用于终端命令提示符): ]; ...
- wordpress 自己制作子主题 child theme
使用 WordPress 的子主题(Child Themes)功能快速制作自己的主题 在了解子主题功能之前,先来看一下你在使用 WordPress 的时候是否是这样:不会自己制作主题,只好从网上下载一 ...
- 详解Spark sql用户自定义函数:UDF与UDAF
UDAF = USER DEFINED AGGREGATION FUNCTION Spark sql提供了丰富的内置函数供猿友们使用,辣为何还要用户自定义函数呢?实际的业务场景可能很复杂,内置函数ho ...
- 修改SQL Service数据库排序规则
修改数据库 alter database KidsPang COLLATE Chinese_PRC_CI_AS 修改表中字段ALTER TABLE [Member] ALTER COL ...
- 在eclipse中,Python项目遇到:…… from appium import webdriver ImportError: No module named appium
1) Traceback (most recent call last): File "D:\python workspace\src\p_test01\__init__.py" ...
- B-、B+、B*树
B-树:多路搜索树,每个结点存储M/2到M个关键字,非叶子结点存储指向关键字范围的子结点:所有关键字在整颗树中出现,且只出现一次,非叶子结点可以命中: B+树:在B-树基础上,为叶子结点增加链表指针, ...
- docker——数据管理
生产环境中使用docker的过程中,往往需要对数据进行持久化,或者需要在多个容器之间进行数据共享.容器中管理数据主要有两种方式: 数据卷(Date Volumes):容器内数据直接映射到本地环境 数据 ...
- [笔记]Delphi 2007写DLL供VC调用实例
考虑如下几种常用情况: - VC传入int,返回int- VC传入char *,返回int- VC传入char *,返回char *及int 为简化问题,传递的字符串参数只考虑ANSI格式,不考虑UN ...
- 如何注册iClap账号?
iClap是一个以产品为基础,集成员工日常所需工具,打通项目工作流程,实现员工自我工作管理.项目管理和企业管理三个体系协同的管理规范系统. 工具/原料 iPhone/Android/浏览器 Teamb ...
- cdoj1638 红藕香残玉簟秋,轻解罗裳,独上兰舟。
地址:http://acm.uestc.edu.cn/#/problem/show/1638 题目: 红藕香残玉簟秋,轻解罗裳,独上兰舟. Time Limit: 4000/2000MS (Java/ ...