java 8新特性學習之五:Java 8 lambda表示式初步第五回
一、lambda表示式和變數捕獲
在lambda表示式中,可以訪問其外層作用域內定義的變數。lambda表示式可以使用其外層類定義的例項或靜態變數。lambda表示式也可以顯式或隱式地訪問this變數,該變數引用lambda表示式的外層類的呼叫例項。lambda表示式可以獲取或設定其外層類的例項或靜態變數的值,以及呼叫其外層類定義的方法。
但是,當lambda表示式使用其外層作用域內定義的區域性變數時,會產生一種特殊的情況,稱為變數捕獲。在這種情況下,lambda表示式只能使用實質上final的區域性變數。實質上final的變數是指在第一次賦值以後,值不再發生變化的變數。沒有必要顯式地將這種變數宣告為final,不過那樣做也不是錯誤(外層作用域的this引數自動是實質上final的變數,lambda表示式沒有自己的this引數)。
lambda表示式不能修改外層作用域內的區域性變數,理解這一點很重要。修改區域性變數會移除其實質上的final狀態,從而使捕獲該變數不合法。
interface MyFunc{
int func(int n);
}
class VarCapture{
public static void main(String args[]){
int num = 10;
MyFunc mylambda=(n)->{
int v = num+n;
return v;
};
}
}
以上num實質上是final變數,所以可以在mylambda內使用。但是,如果修改了num,不管是在lambda表示式內還是表示式外,num就會丟失其實質上final的狀態。這會導致發生錯誤,程式將無法通過編譯。 需要重點強調,lambda表示式可以使用和修改其呼叫類的例項變數,只是不能使用其外層作用域內的區域性變數,除非該變數實質上是final變數。
相關文章
- java 8新特性學習之四:Java 8 lambda表示式初步第四回Java
- java 8新特性學習之三:Java 8 lambda表示式初步第三回Java
- Java 8新特性學習之一:Java 8 lambda表示式初步第六回Java
- java 8新特性學習之二:Java 8 lambda表示式初步第二回Java
- Java 8新特性學習之一:Java 8 lambda表示式初步第一回Java
- java8 新特性之Lambda 表示式Java
- Java8 新特性之 Lambda 表示式Java
- java8新特性之lambda表示式(一)Java
- Java 8新特性(一):Lambda表示式Java
- Java8新特性(1):Lambda表示式Java
- Java8新特性(一)-Lambda表示式Java
- java8特性-lambda表示式Java
- java8的新特性之lambda表示式和方法引用Java
- Java 8 流特性和 Lambda 表示式Java
- Java8新特性第1章(Lambda表示式)Java
- [轉]Java 8 的 lambda 表示式 Java 8 的 lambda 表示式Java
- java8學習:lambda表示式(2)Java
- java8學習:lambda表示式(1)Java
- Java8新特性——從Lambda表示式到Stream流Java
- Java 8新特性:lambda表示式(四)轉載總結Java
- Java 8 Lambda 表示式Java
- java 8 lambda表示式Java
- Java 8 Lambda 表示式學習心得總結Java
- 深圳Java培訓學習:Java8.0新特性之Lambda表示式Java
- 好程式設計師分享java8新特性之Lambda表示式程式設計師Java
- 【譯】java8之lambda表示式Java
- Java8新特性 - LambdaJava
- Java8-Lambda表示式Java
- java8 lambda表示式Java
- 掌握 Java 8 Lambda 表示式Java
- Lambda表示式之爭:Scala vs Java 8Java
- Java8新特性系列-LambdaJava
- Java8新特性系列(Lambda)Java
- Java8 新語法習慣 (級聯 lambda 表示式)Java
- Java8的Lambda表示式Java
- Java 8 中的 lambda 表示式Java
- 深入探索 Java 8 Lambda 表示式Java
- 【java8新特性】蘭姆達表示式Java