ホームページ >Java >&#&チュートリアル >ラムダ式と変数のキャプチャ

ラムダ式と変数のキャプチャ

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2025-01-12 06:29:45659ブラウズ

Expressões lambda e a captura de variáveis

含まれるスコープ内の変数へのアクセス

  • ラムダ式は以下にアクセスできます:
  • それを含むクラスのインスタンス変数。
  • 外部クラスで定義された静的変数。
  • 外部クラスの呼び出しインスタンスを参照する this パラメータ。

ローカル変数へのアクセス

  • 外部スコープのローカル変数を使用する場合:
  • ローカル変数は事実上、final である必要があります。
  • 事実上最終: 代入後に値が変わらない変数。
  • 明示的に最終版として宣言する必要はありません。
  • ローカル変数 (ラムダの内部または外部) を変更すると、そのキャプチャが無効になります。

変更制限
変更できません:

  • ラムダ式内でキャプチャされたローカル変数。
  • これらの変数を変更すると、実質的に最終ステータスが削除されます。

インスタンス変数の変更
ラムダ式では次のことができます:

  • 呼び出しクラスのインスタンス変数を使用および変更します。
  • インスタンス変数の「最終」ステータスに制限はありません。

例: 外部スコープからローカル変数を取得する
コード:

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 のコメントを解除すると、キャプチャが無効になり、コンパイル エラーが発生します。

  • 注:
    重要: インスタンス変数または静的変数は、ラムダ式内で制限なく使用および変更できます。
    制限は外部スコープのローカル変数にのみ適用されます。

以上がラムダ式と変数のキャプチャの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。