私は、2つのコードサンプルを持っている:のJava 8のラムダ変数のスコープ
int[] idx = { 0 };
List<String> list = new ArrayList<String>();
list.add("abc");
list.add("def");
list.add("ghi");
list.stream().forEach(item -> {
System.out.println(idx[0] + ": " + item);
idx[0]++;
});
は正常に動作し。
このコードはコンパイルエラー有するが:
int idx = 0;
List<String> list = new ArrayList<String>();
list.add("abc");
list.add("def");
list.add("ghi");
list.stream().forEach(item -> {
System.out.println(idx + ": " + item);
idx++;
});
と言っ:
Local variable idx defined in an enclosing scope must be final or effectively final.
唯一の違いはidx
intまたは整数配列です。
根本原因は何ですか?
なぜ私はあなたがidxを静的にして、それが正常に動作するメインメソッドの外に移動する場合、私は傾けることはできません – XtremeBaumer
@XtremeBaumerはい、私はidxを静的にして、 、うまく動作します。しかし、なぜ?詳細を共有するのに役立つでしょうか? – coderz
リストには '.forEach'が適用され、ストリームには適用されないことを付け加えておきます: ' list.forEach(item - > {{'' – Tchopane