DEV Community

Expressões lambda e a captura de variáveis

Acesso a Variáveis no Escopo Contido

  • Uma expressão lambda pode acessar:
  • Variáveis de instância da classe que a contém.
  • Variáveis static definidas na classe externa.
  • O parâmetro this, que referencia a instância chamadora da classe externa.

Acesso a Variáveis Locais

  • Ao usar variáveis locais do escopo externo:
  • A variável local deve ser efetivamente final.
  • Efetivamente final: Uma variável cujo valor não é alterado após ser atribuído.
  • Não precisa ser declarada explicitamente como final.
  • Modificar a variável local (dentro ou fora da lambda) invalida sua captura.

Restrição de Modificação
Não é possível modificar:

  • Variáveis locais capturadas dentro da expressão lambda.
  • Modificar essas variáveis remove seu status de efetivamente final.

Modificação de Variáveis de Instância
Uma expressão lambda pode:

  • Usar e modificar variáveis de instância da classe chamadora.
  • Não há restrição quanto ao status "final" para variáveis de instância.

Exemplo: Captura de Variável Local do Escopo Externo
Código:

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;
    }
}

Enter fullscreen mode Exit fullscreen mode

Explicação:

  • Captura de num:
    num é efetivamente final porque não é alterado após a atribuição inicial.
    A lambda pode acessar num, mas não pode modificá-lo.

  • Execução:
    myLambda.func(8) retorna 18 porque:
    num (10) é somado ao parâmetro n (8), produzindo 18.

  • Erro por Modificação:
    Descomentar num++ ou num = 9 invalidaria a captura, causando erro de compilação.

  • Observação:
    Importante: Variáveis de instância ou static podem ser usadas e modificadas sem restrições dentro de expressões lambda.
    Restrições aplicam-se apenas a variáveis locais do escopo externo.

Top comments (0)