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