lambda表达式
概述:
lambda表达式是Java8.0版本后新增的重量级新特性,它的重量级不仅体现在简化代码,更是体现在函数式编程思想以及程序延后执行上,大大提高了编程的效率。
前提概念:
- 函数式编程思想:强调做什么,而不是怎么去做,是面向函数的编程。
- 函数式接口:只含有一个抽象方法的接口。
使用lambda表达式的条件:
- 使用lambda必须具有接口,并且要求接口有且仅有一个抽象方法存在。即是函数式接口。
- 使用lambda必须具有上下文推断。也就是方法的参数与局部变量类型必须为lambda对应的接口类型,才使用lambda作为接口的实例。
lambda表达式的演变由来举例:
按照标准格式写一个多线程的代码如下:
public class Function implements Runnable {
@Override
public void run() {
for (int i = 1; i <=10 ; i++) {
System.out.println("正在打印第"+i+"遍");
}
}
}
public class MyThread {
public static void main(String[] args) {
Function function=new Function();
Thread thread=new Thread(function);
thread.start();
}
}
因为Runnable的实现类只使用一次,可以使用匿名内部类来简化代码,代码如下:
public class Mythread02 {
public static void main(String[] args) {
new Thread(new Runnable() {
@Override
public void run() {
for (int i = 1; i <=10 ; i++) {
System.out.println("正在打印第"+i+"遍");
}
}
}).start();
}
}
使用lambda表达式改进的代码如下:
public class MyThread03 {
public static void main(String[] args) {
new Thread(()->{
for (int i = 1; i <=10 ; i++) {
System.out.println("正在打印第"+i+"遍");
}
}).start();
}
}
使用lambda表达式的省略规则:
()->{
for (int i = 1; i <=10 ; i++) {
System.out.println("正在打印第"+i+"遍");
}
- 小括号内参数类型可以省略;
- 如果小括号内有且仅有一个参数,则小括号可以省略;
- 如果大括号内有且仅有一条语句,则无论是否有返回值,都可以省略大括号、return关键字及语句分号。
使用自定义的函数式接口
与@Override注解作用类似,Java8中专门为函数式接口引入了一个新的注解:@FunctionalInterface。该注解可用于一个接口的定义上。一旦使用该注解来定义接口,编译器将会强制检查该接口是否确实有且仅有一个抽象方法,否则将会报错。需要注意的是,即使不使用该注解,只要满足函数式接口的定义,这仍然是一个函数式接口,使用起来都一样。
lambda表达式的延迟执行(重点)
有些场景的代码执行后,结果不一定会被使用,从而造成性能上浪费,而lambda表达式是延迟执行的。正好可以作为解决方案,提升性能。(在stream流和方法引用中可以体会到延迟执行)