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 capturadaint num = 10;MyFunc myLambda = (n) -> {// Uso correto da variável numint v = num + n;// A instrução abaixo é inválida porque tenta modificar num// num++;return v;};// Usando a expressão lambdaSystem.out.println(myLambda.func(8)); // Exibe: 18// Modificar num aqui também causaria erro// num = 9;}}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; } }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.
暂无评论内容