我们知道JDK 1.8新增了Lambda Expression这一特性。
那么,JDK 1.8为什么要新增这个特性呢?
这个特性给JDK 1.8带来了什么好处?
它在JDK 1.8中可以做什么?不可以做什么?
在这篇文章,我打算简单聊聊这些话题。
1. Lambda Expression是什么?
Lambda Expression,又名 Anonymous function, 它起源于Alonzo Church在1936年提出的 lambda calculus。
这是数理逻辑中的一个概念,具体可以看 Anonymous function wiki 词条。
2. JDK 1.8 为什么引入这个特性?
在JDK 1.8之前,我们是没有办法直接将功能作为参数传递给方法的。
但我们可以将功能封装成类,传递给方法。
比如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 1.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 1.8 中的 lambda expression 可以和 aggregate operations 一起使用,使得代码更加简洁、易懂、不易出错。
3. JDK 1.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这一节。
原文地址:https://www.cnblogs.com/huangzejun/p/8582494.html