[解決済み] ラムダ式から参照されるローカル変数は、final または effectively final でなければならない。
質問
私はJavaFX 8プログラム(JavaFXPortsクロスプラットフォーム用)を持っていて、私が望むことを行うためにかなりフレームされていますが、1つのステップが不足していました。このプログラムは、テキストファイルを読み、行を数えてランダムな範囲を確立し、その範囲から乱数を選び、その行を読み込んで表示するものです。
The error is: local variables referenced from a lambda expression must be final or effectively final
button.setOnAction(e -> l.setText(readln2));
私はjavaに少し新しいですが、私は次のランダムな行を表示するためにLambdaを使用するかどうかであるようだ
Label l
は、私の
button.setOnAction(e -> l.setText(readln2));
の行は、静的な値を期待しています。
画面上のボタンを押すたびに、var readln2 の次の値が表示されるようにするには、どのように調整したらよいでしょうか?
事前にありがとうございます。以下は私のコードです。
String readln2 = null;
in = new BufferedReader(new FileReader("/temp/mantra.txt"));
long linecnt = in.lines().count();
int linenum = rand1.nextInt((int) (linecnt - Low)) + Low;
try {
//open a bufferedReader to file
in = new BufferedReader(new FileReader("/temp/mantra.txt"));
while (linenum > 0) {
//read the next line until the specific line is found
readln2 = in.readLine();
linenum--;
}
in.close();
} catch (IOException e) {
System.out.println("There was a problem:" + e);
}
Button button = new Button("Click the Button");
button.setOnAction(e -> l.setText(readln2));
// error: local variables referenced from a lambda expression must be final or effectively final
解決方法は?
の値をコピーすればいいだけです。
readln2
を
final
変数を使用します。
final String labelText = readln2 ;
Button button = new Button("Click the Button");
button.setOnAction(e -> l.setText(labelText));
毎回新しいランダムな行を取得したい場合は、対象の行をキャッシュし、イベントハンドラでランダムな行を選択することができます。
Button button = new Button("Click the button");
Label l = new Label();
try {
List<String> lines = Files.lines(Paths.get("/temp/mantra.txt"))
.skip(low)
.limit(high - low)
.collect(Collectors.toList());
Random rng = new Random();
button.setOnAction(evt -> l.setText(lines.get(rng.nextInt(lines.size()))));
} catch (IOException exc) {
exc.printStackTrace();
}
// ...
あるいは、イベントハンドラでファイルを再読み込みすることもできます。前者は(はるかに)高速ですが、大量のメモリを消費します。後者はファイルの内容をメモリに保存せず、ボタンが押されるたびにファイルを読み込むので、UIが応答しなくなる可能性があります。
ラムダ式の内部からアクセスできるローカル変数は次のいずれかです。
final
(宣言
final
または、quot;effective final"(基本的に、他のコードに変更を加えることなくfinalにできることを意味します)。
あなたのコードがコンパイルに失敗するのは
readln2
は(ループの中で)複数回値が代入されるため、宣言できません。
final
. したがって、ラムダ式でアクセスすることはできません。上のコードでは、ラムダ式でアクセスされる変数は
l
,
lines
および
rng
これらはすべて一度だけ値が割り当てられるので、実質的にfinal`です。(それらをfinalと宣言しても、コードはコンパイルされます)。
関連
-
[解決済み] Oracle DB : java.sql.SQLException: 閉じた接続
-
[解決済み] Androidのコールバックとは何ですか?重複
-
[解決済み] Mavenです。JARは空になります - 含有するためにマークされたコンテンツがありません
-
[解決済み] スリーピング中のスレッドが割り込まれ、データベースへの接続が失われる
-
[解決済み] java swingアプリケーションでJCEがプロバイダBCを認証できない
-
[解決済み] ラムダ式からプロパティ名を取得する
-
[解決済み】C++11のラムダ式って何?
-
[解決済み】finalとeffectly finalの違いについて
-
[解決済み】Lambda式でOrderBy descending?
-
[解決済み] ラムダ式で使用する変数はfinalまたはeffective finalでなければならない
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Jdbctemplate の文字列に対するクエリです。EmptyResultDataAccessException: 不正な結果サイズ:期待値1、実際0
-
[解決済み] ストリングビルダー.イコール Java
-
[解決済み] Application startメソッドで例外が発生する。JavaFx 11
-
[解決済み] Oracle DB : java.sql.SQLException: 閉じた接続
-
[解決済み] 一部の入力ファイルが非推奨のAPIを使用またはオーバーライドしている
-
[解決済み] 親から継承したメソッドの可視性を下げることができない [重複]。
-
[解決済み] 1行目2列目でBEGIN_ARRAYを期待したが、BEGIN_OBJECTだった。
-
[解決済み] スリーピング中のスレッドが割り込まれ、データベースへの接続が失われる
-
[解決済み] IntegerからBigIntegerへの変換
-
[解決済み】finalとeffectly finalの違いについて