简介

如上图所示,绿色框中就是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表达式(翻译版)的更多相关文章

  1. 解问 lambda表达式

    目录 1.0 何为Lambda 1.1 Lambda语法特征 1.2 Lambda实例 1.3 Lambda中的stream 1.4 Lambda 中的 stream 效率 1.0 何为Lambda ...

  2. PHPExcel中文开发手册翻译版(1)

    请注意这个是粗翻译版,仅供参考,不是精校版 精校版后面才会更新 英文原版在线文档 https://github.com/PHPOffice/PHPExcel/wiki/User%20Documenta ...

  3. C#中的委托,匿名方法和Lambda表达式

    简介 在.NET中,委托,匿名方法和Lambda表达式很容易发生混淆.我想下面的代码能证实这点.下面哪一个First会被编译?哪一个会返回我们需要的结果?即Customer.ID=.答案是6个Firs ...

  4. (转)C#中的委托,匿名方法和Lambda表达式

    简介 在.NET中,委托,匿名方法和Lambda表达式很容易发生混淆.我想下面的代码能证实这点.下面哪一个First会被编译?哪一个会返回我们需要的结果?即Customer.ID=5.答案是6个Fir ...

  5. 初探Lambda表达式/Java多核编程【0】从外部迭代到内部迭代

    开篇 放假前从学校图书馆中借来一本书,Oracle官方的<精通Lambda表达式:Java多核编程>. 假期已过大半才想起来还没翻上几页,在此先推荐给大家. 此书内容及其简洁干练,如果你对 ...

  6. 初探Lambda表达式/Java多核编程【2】并行与组合行为

    今天又翻了一下书的目录,第一章在这之后就结束了.也就是说,这本书所涉及到的新的知识已经全部点到了. 书的其余部分就是对这几个概念做一些基础知识的补充以及更深层次的实践. 最后两个小节的内容较少,所以合 ...

  7. Java8一:Lambda表达式教程

    1. 什么是λ表达式 λ表达式本质上是一个匿名方法.让我们来看下面这个例子: public int add(int x, int y) {         return x + y;     } 转成 ...

  8. 看到他我一下子就悟了-- Lambda表达式

    一直对Lambda表达式似懂非懂,平常也用过,就是不太明白有时候还要百度.周六去图书馆看书,看到下面这几句话,一下子就悟了: Lambda表达式(匿名函数),基本形式: (intput paramte ...

  9. easyui datagrid remoteSort的实现 Controllers编写动态的Lambda表达式 IQueryable OrderBy扩展

    EF 结合easy-ui datagrid 实现页面端排序 EF动态编写排序Lambda表达式 1.前端页面 var mainListHeight = $(window).height() - 20; ...

随机推荐

  1. sipp模拟freeswitch分机测试(SIP协议调试)

    1.freeswitch安装 1) 网上很多安装方法都不靠谱,系统版本,各种依赖库一堆问题,下面是验证的可行的. yum install -y http://files.freeswitch.org/ ...

  2. repo使用

    repo常用指令: 1.repo init(下载repo并克隆manifest) repo init -u URL [OPTIONS] Options: -u:制定一个URL,其连接到一个manife ...

  3. 20165324 Java实验四 Android程序设计

    20165324 Java实验四 Android程序设计 一.实验报告封面 课程:Java程序设计 班级:1653班 姓名:何春江 学号:20165324 指导教师:娄嘉鹏 实验日期:2018年5月1 ...

  4. Yii 2.x 和1.x区别以及yii2.0安装

    知乎上有个类似的问题:http://www.zhihu.com/question/22924271/answer/23085751 大致思路不会变,开发流程变化也不是很大.有变化的是1.yii2带入的 ...

  5. shared_ptr的线程安全

    1.9 再论shared_ptr 的线程安全 虽然我们借shared_ptr 来实现线程安全的对象释放,但是shared_ptr 本身不是100% 线程安全的.它的引用计数本身是安全且无锁的,但对象的 ...

  6. 工作笔记——js前端规范

    去年年末做了一个项目,因为第一次做前端管理职位,第一次做整个项目的前端架构很多东西都不熟悉,作为一次大胆的尝试. js方面的只有一个坑,那就是前端与后端的网络层封装,这一块是在后端的协助下开发的.网络 ...

  7. php array_mutisort

    PHP中array_multisort可以用来一次对多个数组进行排序,或者根据某一维或多维对多维数组进行排序. 关联(string)键名保持不变,但数字键名会被重新索引. 输入数组被当成一个表的列并以 ...

  8. 软工网络15团队作业1——团队组队&展示

    一.团队展示 1.队名:想不出队名 2.队员学号(标记组长) 201521123064 郭炜埕 201521123066 郑晓丽 201521123067 廖怡洁 201521123068 包梦榕 2 ...

  9. H5 动画:轨迹移动 | H5游戏 推金币

    https://aotu.io/notes/2017/11/06/path-animation/ https://aotu.io/notes/2017/11/06/coindozer/

  10. 【c++ primer, 5e】特殊用途语言特性

    [默认实参] 1.注意点:函数的默认实参可以在函数的声明中添加,但是后续声明只能添加默认参数而不能改变先前声明的默认参数.(函数的声明通常是定义在头文件上的,多次声明同一个函数是合法的) 2.默认实参 ...