Search code examples
javajavafxlambdafinal

Edit a local variable inside java lambda


I need to change a local variable inside a lambda event handler in .

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]);
   }

The problem is I need to increment q in each loop, but I can't do that because q must be final or effectively final to be used inside a lambda.


Solution

  • I think you are looking for something like

    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++ ;
    }