![0386505788828fe901a747340479ecd3.png](https://i-blog.csdnimg.cn/blog_migrate/2009e3608a57b89340929a5f063296cf.jpeg)
作者 | Android 大强哥
责编 | 郭芮
出品 | CSDN 博客
本文将介绍 Java 8 新增的 Lambda 表达式,包括 Lambda 表达式的常见用法以及方法引用的用法,并对 Lambda 表达式的原理进行分析,最后对 Lambda 表达式的优缺点进行一个总结。
![6b4cec6e124555089d3b379c349e5086.png](https://i-blog.csdnimg.cn/blog_migrate/bb675955460de33074e2d56a153c23fb.jpeg)
概述
Java 8 引入的 Lambda 表达式的主要作用就是简化部分匿名内部类的写法。
能够使用 Lambda 表达式的一个重要依据是必须有相应的函数接口。所谓函数接口,是指内部有且仅有一个抽象方法的接口。
Lambda 表达式的另一个依据是类型推断机制。在上下文信息足够的情况下,编译器可以推断出参数表的类型,而不需要显式指名。
![d36c7f1e21de1c5c885830249a05ddd1.png](https://i-blog.csdnimg.cn/blog_migrate/48583929da9c3bda0a7caf620be7eaac.jpeg)
常见用法
2.1 无参函数的简写
无参函数就是没有参数的函数,例如 Runnable 接口的 run 方法,其定义如下:
@FunctionalInterface
public interface Runnable {
public abstract void run;
}
在 Java 7 及之前版本,我们一般可以这样使用:
new Thread(new Runnable {
@Override
public void run {
System.out.println("Hello");
System.out.println("Jimmy");
}
}).start;
从 Java 8 开始,无参函数的匿名内部类可以简写成如下方式:
-> {
执行语句
}
这样接口名和函数名就可以省掉了。那么,上面的示例可以简写成:
new Thread( -> {
System.out.println("Hello");
System.out.println("Jimmy");
}).start;
当只有一条语句时,我们还可以对代码块进行简写,格式如下:
-> 表达式
注意这里使用的是表达式,并不是语句,也就是说不需要在末尾加分号。
那么,当上面的例子中执行的语句只有一条时,可以简写成这样:
new Thread( -> System.out.println("Hello")).start;
2.2 单参函数的简写
单参函数是指只有一个参数的函数。例如 View 内部的接口 OnClickListener 的方法 onClick(View v),其定义如下:
public interface OnClickListener {
/**
* Called when a view has been clicked.
*
* @param v The view that was clicked.
*/
void onClick(View v);
}
在 Java 7 及之前的版本,我们通常可能会这么使用:
view.setOnClickListener(new View.OnClickListener {
@Override
public void onClick(View v) {
v.setVisibility(View.GONE);
}
});
从 Java 8 开始,单参函数的匿名内部类可以简写成如下方式:
([类名 ]变量名) -> {
执行语句
}