我需要在javafx中的lambda事件处理程序中更改局部变量。
SerialPort comPorts[] = SerialPort.getCommPorts();
MenuItem[] portsItems = new MenuItem[10];
int q=0;
for (SerialPort port : comPorts) {
portsItems[q] = new MenuItem(port.getSystemPortName());
portsItems[q].setOnAction(actionEvent -> {
portNum = q;
connect.setDisable(false);
});
comPortsMenu.getItems().add(portsItems[q]);
}
问题是我需要在每个循环中增加q,但我无法做到这一点,因为q
必须 最终 或 有效的最终 将在lambda中使用。
答案 0 :(得分:2)
我认为你正在寻找像
这样的东西for (SerialPort port : comPorts) {
portsItems[q] = new MenuItem(port.getSystemPortName());
int portNumber = q ; // effectively final
portsItems[q].setOnAction(actionEvent -> {
portNum = portNumber;
connect.setDisable(false);
});
comPortsMenu.getItems().add(portsItems[q]);
// increment:
q++ ;
}
答案 1 :(得分:0)
您可以执行整数制表符并使用第一个索引来递增。 在lambda中捕获变量,因此引用必须是最终的。 因此,参考不能被另一个替换。我们可以使用一个对象的数组来竞争int值。
答案 2 :(得分:0)
如果你愿意使用apache commons,那么Mutable *类的类提供了一个很好的机制,可以对值进行封闭友好的“装箱”,因为框架提供的大写字母框不会。
对于上述情况,用MutableInt替换q会起作用。
也就是说,通过这个特定的例子,你可以通过使用portsItems的(可变长度)列表以及add()和size() - 1的组合来获得更好的结果,用于相应的“port”值。