Lambda 表达式,也可称为闭包,它是推动 Java 8 发布的最重要新特性。
Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中)。
使用 Lambda 表达式可以使代码变的更加简洁紧凑。
语法
lambda 表达式的语法格式如下:
(parameters) -> expression
或
(parameters) ->{ statements; }
以下是lambda表达式的重要特征:
- 可选类型声明: 不需要声明参数类型,编译器可以统一识别参数值
- 可选的参数圆括号: 一个参数无需定义圆括号,但多个参数需要定义圆括号
- 可选的大括号: 如果主体包含了一个语句,就不需要使用大括号
- 可选的返回关键字: 如果主体只有一个表达式返回值则编译器会自动返回值,大括号需要指定明表达式返回了一个数值
以上是官网对jdk 1.8 lambda的特征描述。 早在年初的时候,就已经对java lambda表达式进行过初步的学习,不知道是不是个人问题,一直都有抗拒心理,“en,这个学起来好麻烦,好而且阅读性不好啦,第二个人都很难看懂”。
其实并不然,下面通过实例进行演示,更直观清晰。
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("test-thread");
}
});
引入lambda表达式后,则可以这么写
Thread thread = new Thread(() -> {System.out.println("test-thread");});
上述lambda表达式的语法:() -> {}(): 括号就是接口方法的括号,接口方法如果有参数,也需要写参数。只有一个参数时,括号可以省略。-> : 分割左右部分的,没啥好讲的。{} : 要实现的方法体。只有一行代码时,可以不加括号,可以不写return。
了解了lambda大概的样子我们继续往下看
Consumer<String> consumer = (x) -> System.out.println(x);
consumer.accept("test");
BinaryOperator<Integer> binary = (x, y) -> x + y;
System.out.println(binary.apply(1, 2));
在上面的表达 式中,我们注意到 (x, y)这里是没有申明方法的参数类型的,却能执行数学运算 +。
这里根据函数接口指定的泛型类为Integer,即可推断方法的参数为Integer,然后执行x + y。
示例就写到这了,比较三个代码块不难看出,lambda确实能显著减少代码量,提高开发效率,而且代码也很容易阅读。
总结
Lambda表达式是一个匿名方法,简化了匿名内部类的写法,把模板语法屏蔽,突出业务语句,传达的更像一种行为。
Lambda表达式是有类型的,JDK内置了众多函数接口
Lambda的3段式结构:(…)-> { …}
上述两个块分别介绍哦了一个参数和两个参数lambda的使用示例。
但是为什么这三个类可以使用lambda表达式呢?
我们自定义的接口是否可以使用lambda表达式吗?
带着疑问,我们移步函数式接口章节