JDK 8 - Lambda Expression 的优点与限制
我们知道 JDK 8 新增了 Lambda Expression 这一特性。
JDK 8 为什么要新增这个特性呢?
这个特性给 JDK 8 带来了什么好处?
它可以做什么?不可以做什么?
在这篇文章,我打算简单聊聊这些话题。
1. Lambda Expression 是什么?
Lambda Expression,又名 Anonymous function, 它起源于 Alonzo Church 在 1936 年提出的 lambda calculus。
这是数理逻辑中的一个概念,具体可以看 Anonymous function。
2. JDK 8 为什么引入这个特性?
在 JDK 8 前,我们没有办法直接将功能(代码)作为参数传递给方法。
但我们可以将功能封装成类(匿名类),传递给方法。
比如 java.util.Arrays.sort(),接收一个 Comparator 参数来指定排序算法(策略模式):
/*
* java.util.Arrays中的sort静态方法,接收两个参数:T[] a, Comparator<? super T> c。
* Comparator是一个接口,含有方法 int compare(T o1, T o2);
*/ public static <T> void sort(T[] a, Comparator<? super T> c) {
if (c == null) {
sort(a);
} else {
if (LegacyMergeSort.userRequested)
legacyMergeSort(a, c);
else
TimSort.sort(a, , a.length, c, null, , );
}
}
JDK 8 引入这个新特性后,Java 具备了将功能作为参数传递给方法的能力,实现了 code as data(to treat functionality as method argument, or code as data)。
函数式语言和一些将函数视作 first-class function 的语言都支持 lambda expression。
Functional Interface 出现的地方都可以使用 Lambda Expression。
Lambda Expression 使得代码量更少,因此代码更简洁、可读性更强(适合仅使用一次或几次、对复用要求不高的代码)。
JDK 8 中的 lambda expression 可以和 aggregate operations 一起使用,使得代码更加简洁、易懂、不易出错。
3. JDK 8 中 Lambda Expression 的限制
(1)Lambda Expression 会抛出异常,这样的 lambda expression 不能同 Java 集合框架中的API一起使用;
(2) Lambda Expression 没有引入新的作用域,它可以直接引用 enclosing method 中的 local variable,这些 local variable must be final/effectively final(必须被final修饰,或虽然没有被final修饰,但没有被更改过)。例子可以看Accessing Local Variables of the Enclosing Scope这一节。
JDK 8 - Lambda Expression 的优点与限制的更多相关文章
- hdu 1031 (partial sort problem, nth_element, stable_partition, lambda expression) 分类: hdoj 2015-06-15 17:47 26人阅读 评论(0) 收藏
partial sort. first use std::nth_element to find pivot, then use std::stable_partition with the pivo ...
- Part 99 Lambda expression in c#
class Program { static void Main(string[] args) { List<Person> persons = new List<Person> ...
- 浅析Java 8新特性Lambda Expression
什么是Lambda Expression 对于Lambda Expression,我的理解是,它是一个函数表达式,如下: (int x, int y) -> x - y 符号左边定义了函数的输入 ...
- Lambda Expression
Java 8的一个大亮点是引入Lambda表达式,使用它设计的代码会更加简洁.当开发者在编写Lambda表达式时,也会随之被编译成一个函数式接口.下面这个例子就是使用Lambda语法来代替匿名的内部类 ...
- Variable used in lambda expression should be final or effectively final
Lambda与匿名内部类在访问外部变量时,都不允许有修改变量的倾向,即若: final double a = 3.141592; double b = 3.141592; DoubleUnaryOpe ...
- Lambda Expression in C#
1.Expression Expression<Func<double, double>> exp = a => Math.Sin(a); 委托类型Func<dou ...
- 关于 lambda expression 返回值的类型转换
lambda expression(lambda 表达式,$\lambda$ 表达式) 是 C++ 11 引入的特性. 一般而言,lambda 表达式的返回值类型可不指定,而由返回值推断. 需要注意的 ...
- C++ lambda expression
Emerged since c++11, lambda expression/function is an unnamed function object capable of capturing v ...
- 三元運算子回傳lambda expression
紀錄一下 假如我想要透過三元運算子?: 傳回lambda expression 要明確轉型
随机推荐
- thinkphp Composer安装指南
1.首先我们去composer的官网下载composer,当然也可以用命令行的形势下下载,我是在windows安装的.https://www.phpcomposer.com/ 2.下载以后进行安装,一 ...
- CTCS-2017滚粗记
Day 0: 下午不到四点就来到了宾馆,环境好评,网速能接受,但是你给我搞了个大床房是什么玩意儿啊... 晚上看MasterJH5574大神一直在写题热身(无限崇拜),自己板子没看几眼就丢到一遍去了, ...
- BZOJ3669/UOJ3 魔法森林(LCT)
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...
- 换个思维,boot结合vue做后台管理
可以添加,可以删除.动态的添加数据. 不用操作dom,只要操作json数据即可. <form class="form-horizontal addForm" id=" ...
- Pandas迭代
Pandas对象之间的基本迭代的行为取决于类型.当迭代一个系列时,它被视为数组式,基本迭代产生这些值.其他数据结构,如:DataFrame和Panel,遵循类似惯例迭代对象的键. 简而言之,基本迭代( ...
- Pandas分类数据
通常实时的数据包括重复的文本列.例如:性别,国家和代码等特征总是重复的.这些是分类数据的例子. 分类变量只能采用有限的数量,而且通常是固定的数量.除了固定长度,分类数据可能有顺序,但不能执行数字操作. ...
- Web2.0 TA 问题记录
记录一下上学期在当Web2.0 TA的时候遇到过的小朋友们问过的问题,可能会成为以后我开发上遇到的问题. 1. 元素的背景默认是boader origin的,也就是说是从边框开始延伸的. 但如果对bo ...
- Git GUI 的使用
下面,我们开始使用Git Gui 如果你想init一个本地的git仓库,到你的代码根目录下,右键选择Git Init Here 这时,你会发现在代码根目录下,生成了一个.git的隐藏属性目录. 再选择 ...
- idea的常用设置
1.官网 官网:http://www.jetbrains.com/idea/download/#section=windows 官方文档:http://www.jetbrains.com/help/i ...
- python多线程抓取代理服务器
文章转载自:https://blog.linuxeye.com/410.html 代理服务器:http://www.proxy.com.ru #coding: utf-8 import urllib2 ...