<JavaLearn/>
ラムダ式 レッスン5

クロージャ

effectively final とラムダ内の変数キャプチャ

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

ラムダ式は外部のローカル変数を「キャプチャ」(参照)できます。 ただし、キャプチャされる変数は effectively final(実質的にfinal)でなければなりません。つまり、初期化後に値が変更されない変数のみ参照できます。 これはスレッドセーフティと予測可能性を確保するための制約です。

  • ラムダ式の外のローカル変数を参照できる(キャプチャ)
  • キャプチャされる変数は final または effectively final である必要がある
  • インスタンス変数やクラス変数にはこの制約はない
  • 配列やオブジェクトの参照はfinalでも中身の変更は可能

effectively final の変数キャプチャ

ラムダ式から外部のローカル変数を参照する例です。 変数に再代入しなければ final を付けなくても参照できます。

Javaエディタ

配列やオブジェクトのキャプチャ

参照自体がfinalであれば、参照先のオブジェクトの状態は変更できます。 配列やリストの中身を変更するのは許可されますが、注意が必要です。

Javaエディタ

メソッド引数のキャプチャ

メソッドの引数もeffectively finalとしてラムダ式からキャプチャできます。 これにより、関数を返す関数(高階関数)のようなパターンが実現できます。

Javaエディタ