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的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: UML的简单介绍和画法
- 下一篇: 乐优商城(04)--商品规格