在我之前的文章中,我们已经学习了如何在java8中创建lambda表达式的例子。
这篇文章是关于变量的范围和lambda表达式中的this/super关键字范围的例子。
java8中Lambda表达式的范围
在Java中,我们有以下不同的作用域。
在类中声明的变量可以在类的任何地方被访问。
在方法中声明的变量只能在声明的方法中的任何地方访问。
在包围范围内声明的变量只能在这个块中访问。例子是for each、while循环和静态块。
Lambda Expressions与anonyms block scope类似。所以在lambda中声明的变量只能在lambda block中访问。
java8中的Lambda表达式局部变量示例
Lambda表达式有一个主体,它不包含新的作用域,但表达式的主体作用域与包围的代码块的作用域相同。
例如,请看下面的代码。
声明了局部变量result,如果你在lambda表达式的主体中声明相同的局部变量,编译器会抛出
Lambda表达式的局部变量结果不能重新声明另一个定义在包围范围内的局部变量的异常。
public class LambdaExpressionScope {
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);
}
在Lambda表达式或封闭式作用域中声明局部变量时,必须用默认值进行初始化。
result 变量被声明,但没有被初始化。编译器给出的错误是局部变量的结果可能没有被初始化
public class LambdaExpressionScope {
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);
}
Lambda final有效最终局部变量示例
有效终结的局部变量是指一旦声明并初始化的变量,就不能与其他值重新分配。
例如,局部变量可以在lambda表达式中声明,并以一个值初始化,但这不是以final声明的,并且不更新其值,将其值打印到控制台。这就是所谓的effectively final declaration 。
在lambda表达式中声明它是一种正确合法的方式。
这些变量可以在包围的范围内或λ表达式的包围范围内声明。
public class LambdaExpressionFinalExampleScope {
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;
};
}
}
interface InterfaceOne{
int add(int a,int b);
}
现在修改lambda表达式中的最终变量,用45重新赋值局部变量。
这给出了编译错误--定义在封闭作用域中的局部变量结果必须是final或有效的final
int result=30;
InterfaceOne inteOne=(a,b)->{
result=45;
System.out.println(result);
return a+b;
};
带有this和super关键字的Lambda表达式示例
如果在lambda表达式中使用了this 关键字。它们的作用与我们声明的方法相同,而不是在lambda主体范围内。
Lamda表达式不会创建一个新的作用域,this 关键字将使用定义lambda表达式的方法作用域。
总结
在本教程中,学习了lambda表达式的局部作用域和有效的最终作用域。