Variable used in lambda expression should be final or effectively final


Lambda與匿名內部類在訪問外部變量時,都不允許有修改變量的傾向,即若:

final double a  = 3.141592;
double b = 3.141592;

DoubleUnaryOperator anotherDoubleUnaryOperator = x -> {
    a = 2; // ERROR
    b = 3; // ERROR
    return 0.0;
    };

  

則:

  • 無法改變final量的值
  • 不允許在Lambda表達式中修改使用的(外部)變量

相應的報錯信息:

  • Cannot assign a value to final variable
  • Variable used in lambda expression should be final or effectively final

由是觀之,我們將Lambda的這種變量捕獲行為稱之為值捕獲更加確切。

在實際操作中,如果我們在Lambda體內或匿名內部類中要對外部的某些量進行操作,那么這種限制也是很容易被規避,因為即使數組是final的(即該數組不能再指向其他數組對象),里面的值依舊可變。

所以我們只要將那個需要被操作的外部變量包裝進一個數組即可:

final double[] a = {3.141592};
final double[] b = {3.141592};

DoubleUnaryOperator anotherDoubleUnaryOperator = x -> {
    a[0] = 2; // COOL
    b[0] = 3; // ALSO COOL
    return 0.0;
};

也算是一個小技巧。

參考文章:http://www.cnblogs.com/hwding/p/6485751.html

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM