zoukankan      html  css  js  c++  java
  • 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

     

  • 相关阅读:
    JDBC_JDBCUtils2.0
    《Fast Approximate Anti-Aliasing (FXAA) (GLSL)》
    《为什么在多核处理器下需要内存屏障(MenmoryBarrier)?》
    《LINUX KERNEL MEMORY BARRIERS》
    《内存对齐与回调函数参数》
    《Anti-aliasing》
    《Deferred Shading》
    《Bloom》
    《Gamma校正》
    《HDR》
  • 原文地址:https://www.cnblogs.com/zl0372/p/springBoot_error_3.html
Copyright © 2011-2022 走看看