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

     

  • 相关阅读:
    Acwing 284.金字塔 (区间DP)
    Acwing 283.多边形 (区间DP)
    Acwing 277.饼干 (DP+排序不等式)
    Acwing 274.移动服务 (DP)
    Acwing 273.分级 (DP)
    Acwing 271.杨老师的照相排序 (DP)
    Acwing 272.最长公共上升子序列 (DP)
    Mybatis-缓存
    mybatis与spring整合
    mybatis-sql映射文件
  • 原文地址:https://www.cnblogs.com/zl0372/p/springBoot_error_3.html
Copyright © 2011-2022 走看看