我们知道 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 这一节。