在我之前的文章中,我们已经学习了如何在java8中创建lambda表达式的例子。
本篇文章是关于变量的范围和lambda表达式中的this/super关键字范围的例子。
Lamda表达式的范围基础知识
在Java中,我们有不同的作用域。
类的范围 -
在类中声明的变量可以在类的任何地方被访问。
方法范围
在方法中声明的变量可以在声明的方法中的任何地方被访问
封闭作用域或块
在封闭作用域中声明的变量只能在这个块中访问。 for each, while, static块
Lamda表达式就像异名块范围。所以在Lambda中声明的变量只能在Lambda块中访问。
Lamda表达式局部变量示例
Lamda表达式有一个主体,不会有新的作用域,但是表达式的主体作用域与包含的代码块的作用域相同。
例如,请看下面的代码。声明了局部变量result,如果你在lambda表达式的boday中声明了相同的局部变量,编译器会抛出
兰姆达表达式的局部变量结果不能重新声明另一个定义在封闭范围内的局部变量的异常。
public static void main(String[] args) {
int result;
InterfaceOne inteOne=(a,b)->{
int result;
return a+b;
}
}
}
interface InterfaceOne{
int add(int a,int b);
}
当在λ表达式或封闭式作用域中声明局部变量时,必须用默认值进行初始化。
结果变量被声明但没有被初始化。编译器给出的错误是:局部变量result可能没有被初始化。
public static void main(String[] args) {
InterfaceOne inteOne=(a,b)->{
int result;
System.out.println(result);
return a+b;
};
}
}
interface InterfaceOne{
int add(int a,int b);
}
final有效的最终局部变量示例
有效终结的局部变量是指一旦声明并初始化的变量,就不能用其他值重新分配。
例如,局部变量可以在lambda表达式中声明,并以一个值初始化,但这不是以final声明的,并且不更新其值,将其值打印到控制台。这被称为有效的最终声明。这是在lambda表达式中声明变量的正确和合法的方式。
这些变量可以在包围的范围内或λ表达式的包围范围内声明。
public static void main(String[] args) {
int result=30; // default final variable
InterfaceOne inteOne=(a,b)->{
// int result=30; you can also declare here, default final variable
System.out.println(result);
return a+b;
};
}
}
现在修改lambda表达式中的最终变量,将局部变量重新赋值为45。这就产生了编译错误--定义在封闭作用域中的局部变量结果必须是final或有效final。
int result=30;
InterfaceOne inteOne=(a,b)->{
result=45;
System.out.println(result);
return a+b;
};
带有this和super关键字的Lamda表达式示例
如果在lambda表达式中使用了这个关键字,那么就会出现这样的情况。它们的作用与我们声明的方法相同,而不是在lambda主体范围内。
Lamda表达式不会创建一个新的作用域,这个关键字将使用定义lambda表达式的方法范围。