还看不懂同事的代码?Lambda 表达式、函数接口了解一下
当前时间:2019年 11月 11日,距离 JDK 14 发布时间(2020年3月17日)还有多少天?
// 距离JDK 14 发布还有多少天? LocalDate jdk14 = LocalDate.of(2020, 3, 17); LocalDate nowDate = LocalDate.now(); System.out.println("距离JDK 14 发布还有:"+nowDate.until(jdk14,ChronoUnit.DAYS)+"天");
1. 前言
Java 8
早已经在2014 年 3月 18日发布,毫无疑问 Java 8
对 Java 来说绝对算得上是一次重大版本更新,它包含了十多项语言、库、工具、JVM 等方面的新特性。比如提供了语言级的匿名函数,也就是被官方称为 Lambda
的表达式语法(外界也称为闭包,Lambda
的引入也让流式操作成为可能,减少了代码编写的复杂性),比如函数式接口,方法引用,重复注解。再比如 Optional
预防空指针,Stearm
流式操作,LocalDateTime
时间操作等。
在前面的文章里已经介绍了 Java 8
的部分新特性。
这一次主要介绍一下 Lambda 的相关情况。
2. Lambda 介绍
Lambda
名字来源于希腊字母表中排序第十一位的字母 λ,大写为Λ,英语名称为 Lambda
。在 Java 中 Lambda
表达式(lambda expression)是一个匿名函数,在编写 Java 中的 Lambda
的时候,你也会发现 Lambda
不仅没有函数名称,有时候甚至连入参和返回都可以省略,这也让代码变得更加紧凑。
3. 函数接口介绍
上面说了这次是介绍 Lambda
表达式,为什么要介绍函数接口呢?其实 Java 中的函数接口在使用时,可以隐式的转换成 Lambda
表达式,在 Java 8
中已经有很多接口已经声明为函数接口,如 Runnable、Callable、Comparator 等。
函数接口的例子可以看下 Java 8
中的 Runnable
源码(去掉了注释)。
package java.lang; @FunctionalInterface public interface Runnable { public abstract void run(); }
那么什么样子的接口才是函数接口呢?有一个很简单的定义,也就是只有一个抽象函数
的接口,函数接口使用注解 @FunctionalInterface
进行声明(注解声明不是必须的,如果没有注解,也是只有一个抽象函数,依旧会被认为是函数接口)。多一个或者少一个抽象函数都不能定义为函数接口,如果使用了函数接口注解又不止一个抽象函数,那么编译器会拒绝编译。函数接口在使用时候可以隐式的转换成 Lambda 表达式。