在 java lambda 中编辑局部变量
Edit a local variable inside java lambda
我需要在 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
必须是 final 或 有效最终 在 lambda 中使用。
你可以做一个整数制表符并使用第一个索引递增。
在 lambda 中变量被捕获,所以引用必须是最终的。
所以参考不能被其他替代。为此,我们应该使用包含 int 值的对象数组。
我想你正在寻找类似
的东西
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++ ;
}
如果您愿意使用 apache commons,类 的 Mutable* 系列为 closure-friendly 'boxing' 值提供了一个很好的机制,因为 capital-letter 框框架提供的没有。
对于上述情况,将 q 替换为 MutableInt 即可。
就是说,对于这个特定的示例,您可能会通过对 portItems 使用(可变长度)列表以及对相应的 [=17] 使用 add() 和 size() - 1 =]值。
我需要在 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
必须是 final 或 有效最终 在 lambda 中使用。
你可以做一个整数制表符并使用第一个索引递增。 在 lambda 中变量被捕获,所以引用必须是最终的。 所以参考不能被其他替代。为此,我们应该使用包含 int 值的对象数组。
我想你正在寻找类似
的东西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++ ;
}
如果您愿意使用 apache commons,类 的 Mutable* 系列为 closure-friendly 'boxing' 值提供了一个很好的机制,因为 capital-letter 框框架提供的没有。
对于上述情况,将 q 替换为 MutableInt 即可。
就是说,对于这个特定的示例,您可能会通过对 portItems 使用(可变长度)列表以及对相应的 [=17] 使用 add() 和 size() - 1 =]值。