gpt4 book ai didi

java - 从 lambda 表达式引用的局部变量必须是最终的或实际上是最终的

转载 作者:太空狗 更新时间:2023-10-29 22:40:00 26 4
gpt4 key购买 nike

我有一个 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)); 行需要一个静态值。

有什么想法可以让我每次按下屏幕上的按钮时简单地显示 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 无响应。

你得到的错误基本上告诉你出了什么问题:你可以从 lambda 表达式内部访问的唯一局部变量是 final(声明为 final,这意味着它们必须只分配一次值)或“有效最终”(这基本上意味着您可以在不对代码进行任何其他更改的情况下使它们最终化)。

您的代码无法编译,因为 readln2 被多次赋值(在循环内),因此它不能被声明为 final。因此您不能在 lambda 表达式中访问它。在上面的代码中,在 lambda 中访问的唯一变量是 llinesrng,它们都是“有效的 final”,因为它们被赋值一次。(您可以将它们声明为 final 并且代码仍然可以编译。)

关于java - 从 lambda 表达式引用的局部变量必须是最终的或实际上是最终的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27592379/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com