如何在 for 循环中为每个按钮创建一个 lambda 表达式?
How can I make buttons in a for loop with a lamda expression for each?
我正在尝试用 javafx 制作刽子手游戏。所以很自然地,我尝试使用 for 循环来创建每个按钮,而不是制作 26 个单独的按钮。我将它们放入一个名为 alphabet 的 ArrayList 中,并将它们添加到一个 flowPane 中。我 运行 遇到的麻烦是当我尝试将每个按钮的动作设置为使用其字母参数的函数时,该函数检查字母是否已被使用或是否在单词中.
所有实例化:
ArrayList<Button> alphabet = new ArrayList<Button>();
FlowPane keyboard = new FlowPane();
字母猜函数(目前为空)
public void letterGuess(char letter) {
}
我的 launch() 函数中的代码:
char letter;
for(int i=0 ; i<26 ; i++) {
letter = (char) (i+65);
alphabet.add(new Button("" + letter));
keyboard.getChildren().add(alphabet.get(i));
alphabet.get(i).setOnAction(e -> letterGuess(letter));
}
我希望代码 运行 无误地通过,并成功将每个按钮的字母传递给 letterGuess()。我得到的错误是在 letter in
alphabet.get(i).setOnAction(e -> 字母猜测(字母));错误说:在封闭范围内定义的局部变量字母必须是最终的或有效的最终
lambda
中使用的 variables
必须是 global
、 final
或 effectively final
才能正确执行。所以你可以让它成为最终的,因为它在循环中是本地的:
final char letter = (char) (i+65);
或
声明letter
为全局变量。
问题是您在循环外声明 letter
并因此试图在循环内更改它的值。这意味着 lambda 不能使用它,因为它不是 final 或 "effectively" final。
您可以通过在循环中将 char
声明为新的来解决此问题。
这是另一种编写循环的方法,它可以正常工作:
for (int i = 0; i < 26; i++) {
char letter = (char) (i + 65);
Button button = new Button(String.valueOf(letter));
button.setOnAction(event -> letterGuess(letter));
alphabet.add(button);
}
您也可以在循环中将 letter
声明为 final
,但在这种情况下没有必要。因为letter
在循环中只被赋值一次,所以有效final
并且lamba知道。
工作代码如下:
for(int i=0; i<26 ; i++) {
char letter = (char) (i+65);
alphabet.add(new Button("" + letter));
keyboard.getChildren().add(alphabet.get(i));
alphabet.get(i).setOnAction(e -> letterGuess(letter));
}
List alphabets = IntStream.range(0, 26)
.mapToObj(i -> (char) (i + 65))
.map(l -> new Button(String.valueOf(l)))
.collect(Collectors.toList());
你可以在一行中完成,如果你有语法错误,请原谅我,因为我是用手机输入的。
我正在尝试用 javafx 制作刽子手游戏。所以很自然地,我尝试使用 for 循环来创建每个按钮,而不是制作 26 个单独的按钮。我将它们放入一个名为 alphabet 的 ArrayList 中,并将它们添加到一个 flowPane 中。我 运行 遇到的麻烦是当我尝试将每个按钮的动作设置为使用其字母参数的函数时,该函数检查字母是否已被使用或是否在单词中.
所有实例化:
ArrayList<Button> alphabet = new ArrayList<Button>();
FlowPane keyboard = new FlowPane();
字母猜函数(目前为空)
public void letterGuess(char letter) {
}
我的 launch() 函数中的代码:
char letter;
for(int i=0 ; i<26 ; i++) {
letter = (char) (i+65);
alphabet.add(new Button("" + letter));
keyboard.getChildren().add(alphabet.get(i));
alphabet.get(i).setOnAction(e -> letterGuess(letter));
}
我希望代码 运行 无误地通过,并成功将每个按钮的字母传递给 letterGuess()。我得到的错误是在 letter in alphabet.get(i).setOnAction(e -> 字母猜测(字母));错误说:在封闭范围内定义的局部变量字母必须是最终的或有效的最终
lambda
中使用的 variables
必须是 global
、 final
或 effectively final
才能正确执行。所以你可以让它成为最终的,因为它在循环中是本地的:
final char letter = (char) (i+65);
或
声明letter
为全局变量。
问题是您在循环外声明 letter
并因此试图在循环内更改它的值。这意味着 lambda 不能使用它,因为它不是 final 或 "effectively" final。
您可以通过在循环中将 char
声明为新的来解决此问题。
这是另一种编写循环的方法,它可以正常工作:
for (int i = 0; i < 26; i++) {
char letter = (char) (i + 65);
Button button = new Button(String.valueOf(letter));
button.setOnAction(event -> letterGuess(letter));
alphabet.add(button);
}
您也可以在循环中将 letter
声明为 final
,但在这种情况下没有必要。因为letter
在循环中只被赋值一次,所以有效final
并且lamba知道。
工作代码如下:
for(int i=0; i<26 ; i++) {
char letter = (char) (i+65);
alphabet.add(new Button("" + letter));
keyboard.getChildren().add(alphabet.get(i));
alphabet.get(i).setOnAction(e -> letterGuess(letter));
}
List alphabets = IntStream.range(0, 26)
.mapToObj(i -> (char) (i + 65))
.map(l -> new Button(String.valueOf(l)))
.collect(Collectors.toList());
你可以在一行中完成,如果你有语法错误,请原谅我,因为我是用手机输入的。