このコードスニペットでは、変数 i
は実質的に final
とは言えません。なぜなら、変数 i
はラムダ式内で参照される前に再代入されているためです。具体的には、i
がラムダ式内で使用される前に i++
によってその値が変更されています。このため、コンパイル時にエラーが発生します。
以下は該当する部分を示します:
void sample() {
int i = 0;
Supplier<Integer> foo = () -> i;
i++; // ここで i の値が変更されるため、実質的に final ではなくなる
System.out.println(foo.get());
}
このコードは、コンパイル時に以下のエラーが発生します:
local variables referenced from a lambda expression must be final or effectively final
ラムダ式で参照される変数 i
が実質的に final
と見なされるためには、その値が再代入されないことが必要です。したがって、再代入されるコードを削除または変更する必要があります。
修正例:
void sample() {
final int i = 0;
Supplier<Integer> foo = () -> i;
// i++; // この行を削除
System.out.println(foo.get());
}
もしくは、
void sample() {
int i = 0;
Supplier<Integer> foo = () -> i;
System.out.println(foo.get());
i++; // ラムダ式の後に i を変更
}
このように、ラムダ式内で使用する変数が変更されないようにすることで、実質的に final
として扱われ、コンパイルエラーを回避できます。
Top comments (0)