首页 >Java >java教程 >Lambda 表达式和捕获变量

Lambda 表达式和捕获变量

Mary-Kate Olsen
Mary-Kate Olsen原创
2025-01-12 06:29:45701浏览

Expressões lambda e a captura de variáveis

访问包含范围内的变量

  • lambda 表达式可以访问:
  • 包含类的实例变量。
  • 外部类中定义的静态变量。
  • this 参数,引用外部类的调用实例。

访问局部变量

  • 使用外部作用域局部变量时:
  • 局部变量必须是有效的final。
  • 有效的最终变量:赋值后其值不会改变的变量。
  • 不需要显式声明为final。
  • 修改局部变量(在 lambda 内部或外部)会使其捕获无效。

修改限制
无法修改:

  • 在 lambda 表达式中捕获的局部变量。
  • 修改这些变量会删除它们的有效最终状态。

实例变量的修改
lambda 表达式可以:

  • 使用和修改调用类的实例变量。
  • 实例变量的“最终”状态没有限制。

示例:从外部作用域捕获局部变量
代码:

interface MyFunc {
    int func(int n);
}

class VarCapture {
    public static void main(String args[]) {
        // Variável local que pode ser capturada
        int num = 10;

        MyFunc myLambda = (n) -> {
            // Uso correto da variável num
            int v = num + n;

            // A instrução abaixo é inválida porque tenta modificar num
            // num++;

            return v;
        };

        // Usando a expressão lambda
        System.out.println(myLambda.func(8)); // Exibe: 18

        // Modificar num aqui também causaria erro
        // num = 9;
    }
}

说明:

  • 数字捕获:
    num 实际上是最终的,因为它在初始分配后不会更改。
    Lambda 可以访问 num,但不能修改它。

  • 执行:
    myLambda.func(8) 返回 18 因为:
    num (10) 与参数 n (8) 相加,得到 18。

  • 修改错误:
    取消注释 num 或 num = 9 会使捕获无效,从而导致编译错误。

  • 注意:
    重要提示:可以在 lambda 表达式中不受限制地使用和修改实例或静态变量。
    限制仅适用于外部作用域局部变量。

以上是Lambda 表达式和捕获变量的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn