1.Lambda表达式
Java 8 引入的 Lambda 表达式的主要作用就是简化部分匿名内部类的写法。
能够使用 Lambda 表达式的一个重要依据是必须有相应的函数接口。所谓函数接口,是指内部有且仅有一个抽象方法的接口。
Lambda 表达式的另一个依据是类型推断机制。在上下文信息足够的情况下,编译器可以推断出参数表的类型,而不需要显式指明。
2.Lambda表达式的用法
①无参函数的简写
无参函数就是没有参数的函数,例如 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;
②单参函数的简写
单参函数是指只有一个参数的函数。例如 View 内部的接口 OnClickListener 的方法 onClick(View v),其定义如下:
public interface OnClickListener {
void onClick(View v);
}
在 Java 7 及之前的版本,我们通常可能会这么使用:
view.setOnClickListener(new View.OnClickListener {
@Override
public void onClick(View v) {
v.setVisibility(View.GONE);
}
});
从 Java 8 开始,单参函数的匿名内部类可以简写成如下方式:
([类名 ]变量名) -> {
//执行语句
}
其中类名是可以省略的,因为 Lambda 表达式可以自己推断出来。那么上面的例子可以简写成如下两种方式:
view.setOnClickListener((View v) -> {
v.setVisibility(View.GONE);
});
view.setOnClickListener((v) -> {
v.setVisibility(View.GONE);
});</