Javaのラムダ式についての質問です。
ある本に次のように書いていました。
「ラムダ式には「自身が評価され関数の実体が生み出される際、その時点でアクセス可能なすべての変数の情報を記憶し、ラムダ式内で利用できる」という特徴があります。
つまり、次のようなコードが記述可能なのです。
double b = 4.3; IntDoubleFunction fun = x -> x*x*3.14;
ただし、ラムダ式内でラムダ式外にある変数を書き換えることはできません。
また、ラムダ式外にある変数bは内容が変化しない実質的にfinalな変数である必要があります。」
最後の文書「実質的にfinalな変数である必要があります。」についてですが、これってどういう意味なんでしょうか。
次のようなコードを書いてみました。
import java.util.function.IntToDoubleFunction; public class Main { public static void main(String[] args) { int a = new java.util.Random().nextInt(4); IntToDoubleFunction b = x -> {return a*a*3.14;}; double c = b.applyAsDouble(a); System.out.println(c); } }
上のコードの変数aはfinalではなく、実行の度に値が変わりますが、問題なく動作しました。
しかしながら、確かに、一つの実行の時には、値が定まるという意味ではfinalな変数になっているのかもしれませんが、なんとなく腑に落ちない感じです。
「実質的にfinalな変数」とは一体どういう変数なのでしょうか。


回答3件
あなたの回答
tips
プレビュー