DEV Community

FUNDAMENTOS JAVA
FUNDAMENTOS JAVA

Posted on

3 1

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.

Image of Datadog

How to Diagram Your Cloud Architecture

Cloud architecture diagrams provide critical visibility into the resources in your environment and how they’re connected. In our latest eBook, AWS Solution Architects Jason Mimick and James Wenzel walk through best practices on how to build effective and professional diagrams.

Download the Free eBook

Top comments (0)

A Workflow Copilot. Tailored to You.

Pieces.app image

Our desktop app, with its intelligent copilot, streamlines coding by generating snippets, extracting code from screenshots, and accelerating problem-solving.

Read the docs