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