我们知道 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 的优点与限制的更多相关文章

  1. 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 ...

  2. Part 99 Lambda expression in c#

    class Program { static void Main(string[] args) { List<Person> persons = new List<Person> ...

  3. 浅析Java 8新特性Lambda Expression

    什么是Lambda Expression 对于Lambda Expression,我的理解是,它是一个函数表达式,如下: (int x, int y) -> x - y 符号左边定义了函数的输入 ...

  4. Lambda Expression

    Java 8的一个大亮点是引入Lambda表达式,使用它设计的代码会更加简洁.当开发者在编写Lambda表达式时,也会随之被编译成一个函数式接口.下面这个例子就是使用Lambda语法来代替匿名的内部类 ...

  5. Variable used in lambda expression should be final or effectively final

    Lambda与匿名内部类在访问外部变量时,都不允许有修改变量的倾向,即若: final double a = 3.141592; double b = 3.141592; DoubleUnaryOpe ...

  6. Lambda Expression in C#

    1.Expression Expression<Func<double, double>> exp = a => Math.Sin(a); 委托类型Func<dou ...

  7. 关于 lambda expression 返回值的类型转换

    lambda expression(lambda 表达式,$\lambda$ 表达式) 是 C++ 11 引入的特性. 一般而言,lambda 表达式的返回值类型可不指定,而由返回值推断. 需要注意的 ...

  8. C++ lambda expression

    Emerged since c++11, lambda expression/function is an unnamed function object capable of capturing v ...

  9. 三元運算子回傳lambda expression

    紀錄一下 假如我想要透過三元運算子?: 傳回lambda expression 要明確轉型

随机推荐

  1. Amazon SES介绍 - SES发送邮件的过程

     Amazon SES,  全称Amazon Simple Email Service,即Amazon简单邮件服务,它是Amazon提供的一款供开发人员或公司企业用来处理邮件相关业务的服务,也就是说, ...

  2. 新东方雅思词汇---8.3、apt

    新东方雅思词汇---8.3.apt 一.总结 一句话总结:本身为词根 adj. 恰当的:有…倾向的:灵敏的 本身为词根 英 [æpt]  美 [æpt]  adj. 恰当的:有…倾向的:灵敏的 n. ...

  3. spring boot MongoDB的集成和使用

    前言 上一章节,简单讲解了如何集成Spring-data-jpa.本章节,我们来看看如何集成NoSQL的Mongodb.mongodb是最早热门非关系数据库的之一,使用也比较普遍.最适合来存储一些非结 ...

  4. ElasticSearch6.0 Java API 使用 排序,分组 ,创建索引,添加索引数据,打分等(一)

    ElasticSearch6.0  Java API  使用     排序,分组 ,创建索引,添加索引数据,打分等 如果此文章对你有帮助,请关注一下哦 1.1 搭建maven 工程  创建web工程 ...

  5. 前端之jQuery02

    文档操作 重点:创建标签,jQuery里面没有这个方法 内部(子标签) 添加到指定元素内部后面 $(A).append(B): // B作为A的最后一个儿子元素:(把B追加到A) $(A).appen ...

  6. [QT] Tab键切换焦点顺序

    在Qt Designer 中点击“编辑Tab顺序“按钮进入编辑Tab顺序模式,如下图: 之后界面会变成这样: 随处点击右键即可弹出菜单,选择  "制表符顺序列表..." 出现 剩下 ...

  7. 利用aop完成功能权限验证遇到的问题

    报错信息如上,找不到此方法原因是services层的有的方法带了parameters! 解决:注解解析器这里的代码不变:  将得到的service层的class遍历所有方法(存在效率问题) 匹配该方法 ...

  8. Linux 下新增用户的流程

    一: 新增用户 1.添加新的用户账号使用useradd命令,其语法如下: 代码:useradd 选项 用户名其中各选项含义如下: 代码:-c comment 指定一段注释性描述.-d 目录 指定用户主 ...

  9. 浅析Python中bytes和str区别

    本博转载自:Chown-Jane-Y的浅析Python3中的bytes和str类型 Python 3最重要的新特性之一是对字符串和二进制数据流做了明确的区分.文本总是Unicode,由str类型表示, ...

  10. bzoj 4565 字符合并

    Written with StackEdit. Description 有一个长度为 \(n\) 的 \(01\) 串,你可以每次将相邻的 \(k\) 个字符合并,得到一个新的字符并获得一定分数.得到 ...