質問編集履歴

1 コードを選択して、</>を押してみました。

退会済みユーザー

退会済みユーザー

2016/08/08 09:10  投稿

Javaのラムダ式について
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な変数」とは一体どういう変数なのでしょうか。
  • Java

    17058 questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る