我们知道 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. QT 进度条 QProgressDialog

    //默认构造函数 参数依次为,对话框正文,取消按钮名称,进度条范围,及所属 QProgressDialog *progressDlg=new QProgressDialog( QStringLiter ...

  2. Ubuntu 1210怎么获得root权限登录

    Ubuntu 12.10 怎么用Root 登录?以下是Ubuntu 12.10 启用Root 登录的方法吗,希望对大家有些帮助吧! 方法如下: 1.先设定一个 Root 密码 sudo passwd ...

  3. oracle 结构化语言查询 DML DDL DCL

    --结构化查询语言 (Structured Query Language),具有定义. --查询.更新和控制等多种功能,是关系数据库的标准语言. --SQL分类: -- 数据操纵语言DML Data ...

  4. 子tab里面新增tab(top.jQuery)

    top.jQuery应用. var jq = top.jQuery; if (jq("#centre").tabs("exists", "预览页面&q ...

  5. RabbitMQ Consumer获取消息的两种方式(poll,subscribe)解析

    以下转自:http://blog.csdn.net/yangbutao/article/details/10395599 rabbitMQ中consumer通过建立到queue的连接,创建channe ...

  6. 案例学习:留言本制作V1、V2

    需求V1: 请设计一个留言本功能的程序,包括普通用户发布和查看留言,管理员登录.查看和删除留言. 实验指导内容详见留言本制作(1) 需求V2: 1.请修改留言本程序的功能,添加普通用户添加登录功能,用 ...

  7. python 邮件发送实例

    #!/usr/bin/env python # -*- coding: utf-8 -*- from email.header import Header from email.mime.text i ...

  8. Linux系列—策略路由、ip rule、ip route

    早期在管理Linux系统的网络时,常使用ifconfig及route之类的命令,不过如果你准备开始使用Linux强大的基于策略的路由机制,那么,就请不要使用这类工具了,因为这类工具根本无法用于功能强大 ...

  9. 反汇编工具 objdump的使用简介

    arm-linux-objdump -D led.elf > led_elf.dis objdump是gcc工具链中的反汇编工具,作用是由编译链接好的elf格式的可执行程序反过来得到反汇编代码 ...

  10. Prism5.0新内容(纯汉语版)

    Prism 5.0 包含很多新东西,新的快速入门示例,新的范例,更新的文档,Prism类库代码的改变.用来解决已有问题,回应社区所提的需求.(这句话跟 What's New in Prism Libr ...