ラムダ式 レッスン5
クロージャ
effectively final とラムダ内の変数キャプチャ
ラムダ式と変数キャプチャ
ラムダ式は外部のローカル変数を「キャプチャ」(参照)できます。 ただし、キャプチャされる変数は effectively final(実質的にfinal)でなければなりません。つまり、初期化後に値が変更されない変数のみ参照できます。 これはスレッドセーフティと予測可能性を確保するための制約です。
- ラムダ式の外のローカル変数を参照できる(キャプチャ)
- キャプチャされる変数は
finalまたは effectively final である必要がある - インスタンス変数やクラス変数にはこの制約はない
- 配列やオブジェクトの参照はfinalでも中身の変更は可能
effectively final の変数キャプチャ
ラムダ式から外部のローカル変数を参照する例です。 変数に再代入しなければ final を付けなくても参照できます。
Javaエディタ
配列やオブジェクトのキャプチャ
参照自体がfinalであれば、参照先のオブジェクトの状態は変更できます。 配列やリストの中身を変更するのは許可されますが、注意が必要です。
Javaエディタ
メソッド引数のキャプチャ
メソッドの引数もeffectively finalとしてラムダ式からキャプチャできます。 これにより、関数を返す関数(高階関数)のようなパターンが実現できます。
Javaエディタ