日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java nextintln_java – 从lambda表达式引用的局部变量必须是final或者有效的final

發布時間:2023/12/10 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java nextintln_java – 从lambda表达式引用的局部变量必须是final或者有效的final 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

我有一個JavaFX 8程序(適用于JavaFXPorts交叉平臺),它實際上是為了做我想做的事情,但卻是一步之遙.程序讀取文本文件,對行進行計數以建立隨機范圍,從該范圍中選取一個隨機數并讀取該行以進行顯示.

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)); line期望靜態值.

我每次按下屏幕上的按鈕時,如何調整我所擁有的只是簡單地顯示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 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 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無響應.

你得到的錯誤基本上告訴你出了什么問題:你可以從lambda表達式中訪問的唯一局部變量是final(聲明為final,這意味著它們必須被賦值一次)或“有效final”(這基本上意味著)你可以讓它們最終完成而不需要對代碼進行任何其他更改).

您的代碼無法編譯,因為readln2被多次賦值(在循環內),因此無法將其聲明為final.因此,您無法在lambda表達式中訪問它.在上面的代碼中,lambda中訪問的唯一變量是l,lines和rng,它們都是“有效的最終”,因為它們只被賦值一次.(你可以將它們聲明為final,代碼仍然可以編譯.)

標簽:java,lambda

來源: https://codeday.me/bug/20191007/1868508.html

總結

以上是生活随笔為你收集整理的java nextintln_java – 从lambda表达式引用的局部变量必须是final或者有效的final的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。