在 java lambda 中编辑局部变量

Edit a local variable inside java lambda

我需要在 中更改 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 =]值。