変数を使用してラムダ式は、これらのルールに従う必要があります:
図1は、唯一の外側のローカル変数ローカル変数の定義は、ラムダの域外適用内で変更することができないことを意味し、最終的なマーク、そうでない場合、コンパイルエラーを参照することができます。
図2は、finalとして宣言されたローカル変数(すなわち、最終的な暗黙の意味を有する)ではないかもしれないが、後のコードに変更してはならない
パラメータ3、同じ名前またはローカル変数とローカル変数を宣言することを許可しました。
次のコードは、コンパイラが文句を言うだろう:
パブリック 静的 ボイドメイン(文字列引数[]){ リストの<string> DEST = 新規のArrayList <> (); 一覧 <文字列> SRC = 新しい ArrayListを<>(は、Arrays.asList( "01"、 "02"、 "03" )); src.forEach(項目 - > { 追加(DEST、項目); }); DEST = nullを。 }
第ルール違反ので(ローカル変数がfinalとして宣言することはできないが、(コードで後で変更してはならない、すなわち、劣性セマンティック決勝を有します))
少しDESTへの変更を削除するように変更、あなたがコンパイルできます。
パブリック 静的 ボイドメイン(文字列引数[]){ リストの<string> DEST = 新規のArrayList <> (); 一覧 <文字列> SRC = 新しい ArrayListを<>(は、Arrays.asList( "01"、 "02"、 "03" )); src.forEach(項目 - > { 追加(DEST、項目); }); }
ラムダ式では、ローカル変数がスレッドに渡され、関連する操作を実行します。
パブリック 静的 ボイドメイン(文字列引数[]){ リストの<string> DEST = 新規のArrayList <> (); 一覧 <文字列> SRC = 新しい ArrayListを<>(は、Arrays.asList( "01"、 "02"、 "03" )); 新しいスレッド(() - >を追加(destが、 "A" 。)))(スタート。 してみてください{ のThread.sleep( 1000 ); } キャッチ(InterruptedExceptionある電子){ e.printStackTrace(); } のSystem.out.println(dest.size())。 L、文字列の項目){ l.add(アイテム) System.out.println(アイテム) }