为什么使用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; ...
随机推荐
- js 屏蔽浏览器右键菜单
<script type="text/javascript"> function doNothing(){ window.event.returnValue=false ...
- Spark2.0机器学习系列之6:GBDT(梯度提升决策树)、GBDT与随机森林差异、参数调试及Scikit代码分析
概念梳理 GBDT的别称 GBDT(Gradient Boost Decision Tree),梯度提升决策树. GBDT这个算法还有一些其他的名字,比如说MART(Multiple Addi ...
- python手写神经网络实现识别手写数字
写在开头:这个实验和matlab手写神经网络实现识别手写数字一样. 实验说明 一直想自己写一个神经网络来实现手写数字的识别,而不是套用别人的框架.恰巧前几天,有幸从同学那拿到5000张已经贴好标签的手 ...
- Python函数参数*args和**kwargs
1. Python中使用*args和**kwargs #!/usr/bin/env python3 # coding: utf-8 # File: args_kwargs_demo.py # Auth ...
- 前端须知的http header
文件信息: Content-Type: application/x-javascript Content-Length: 2000 Content-Type:指定请求和响应的内容类型,如果未指定即为t ...
- Delphi FastReport动态加载图片 (转载)
以前用FastReport制作报表,从来没有打印过图片,这段时间做了个打印个人简历的程序,需要打印照片.试着在frreport模板中加载照片没 问题,可是想要动态的装载照片要怎么做呢,我的要求是将个人 ...
- 19. Remove Nth Node From End of List(移除倒数第N的结点, 快慢指针)
Given a linked list, remove the nth node from the end of list and return its head. For example, Give ...
- hdu2609 How many
地址:http://acm.hdu.edu.cn/showproblem.php?pid=2609 题目: How many Time Limit: 2000/1000 MS (Java/Others ...
- 带你走进AJAX(1)
ajax是什么? (1)ajax (asynchronouse javascript and xml) 异步的javascript 和xml (2)ajax是一个粘合剂,将javascript.xml ...
- javascript中常用函数汇总
js中函数很多,在实际项目开发中,函数的应用可以很大程度上简化我们的代码,所以在此记下开发中js中常用的函数,增强记忆. 1.isNaN(X):函数用于检查其参数是否是非数字值. 如果 x 是特殊的非 ...