Lambda表达式
作者:互联网
作用
简化匿名内部类的代码写法
格式
(匿名内部类被重写方法的形参列表) -> {
被重写方法的方法体代码
}
注意:Lambda表达式只能简化函数式接口的匿名内部类的写法形式
例:
Arrays.sort(arr, new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o2 - o1;
}
});
可以写成:
Arrays.sort(arr, (Integer o1, Integer o2) -> {
return o2 - o1;
});
函数式接口:接口中有且仅有一个抽象方法的形式,通常会在接口上方加上一个@FunctionalInterface注解,标记
该接口必须满足函数式接口
例:
@FunctionalInterface
public interface Comparator<T> {
int compare(T o1, T o2);
}
省略写法
- 参数类型可以省略不写
- 如果只有一个参数,参数类型可以省略,同时()也可以省略
- 如果Lambda表达式的方法体代码只有一行代码。可以省略大括号不写,同时要省略分号。如果这行代码是return语句,必须省略return不写
Arrays.sort(arr, ((o1, o2) -> o2 - o1));
访问变量
Lambda 表达式可以访问所在外层作用域定义的变量,包括成员变量和局部变量。
访问成员变量
成员变量包括实例成员变量和静态成员变量。在 Lambda 表达式中可以访问这些成员变量,此时的 Lambda 表达式与普通方法一样,可以读取成员变量,也可以修改成员变量。
public class LambdaDemo { // 实例成员变量 private int value = 10; // 静态成员变量 private static int staticValue = 5; // 静态方法,进行加法运算 public static Calculable add() { Calculable result = (int a, int b) -> { // 访问静态成员变量,不能访问实例成员变量 staticValue++; int c = a + b + staticValue; // this.value; return c; }; return result; } // 实例方法,进行减法运算 public Calculable sub() { Calculable result = (int a, int b) -> { // 访问静态成员变量和实例成员变量 staticValue++; this.value++; int c = a - b - staticValue - this.value; return c; }; return result; }}
LambdaDemo 类中声明一个实例成员变量 value 和一个静态成员变量 staticValue。此外,还声明了静态方法 add(见代码第 8 行)和实例方法 sub(见代码第 20 行)。add 方法是静态方法,静态方法中不能访问实例成员变量,所以代码第 13 行的 Lambda 表达式中也不能访问实例成员变量,也不能访问实例成员方法。
sub 方法是实例方法,实例方法中能够访问静态成员变量和实例成员变量,所以代码第 23 行的 Lambda 表达式中可以访问这些变量,当然实例方法和静态方法也可以访问。当访问实例成员变量或实例方法时可以使用 this,如果不与局部变量发生冲突情况下可以省略 this。
访问局部变量
对于成员变量的访问 Lambda 表达式与普通方法没有区别,但是访问局部变量时,变量必须是 final 或Effectively final类型的(不可改变)。
示例代码如下:
public class LambdaDemo {
// 实例成员变量
private int value = 10;
// 静态成员变量
private static int staticValue = 5;
// 静态方法,进行加法运算
public static Calculable add() {
// 局部变量
int localValue = 20;
Calculable result = (int a, int b) -> {
// localValue++;
// 编译错误
int c = a + b + localValue;
return c;
};
return result;
}
// 实例方法,进行减法运算
public Calculable sub() {
// final局部变量
final int localValue = 20;
Calculable result = (int a, int b) -> {
int c = a - b - staticValue - this.value;
// localValue = c;
// 编译错误
return c;
};
return result;
}
}
上述代码第 10 行和第 23 行都声明一个局部变量 localValue,Lambda 表达式中访问这个变量,如代码第 14 行和第 25 行。不管这个变量是否显式地使用 final 修饰,它都不能在 Lambda 表达式中修改变量,所以代码第 12 行和第 26 行如果去掉注释会发生编译错误。
Lambda 表达式只能访问局部变量而不能修改,否则会发生编译错误,但对静态变量和成员变量可读可写。
标签:return,变量,int,成员,实例,表达式,Lambda 来源: https://www.cnblogs.com/timqiu/p/16630345.html