编辑java lambda中的局部变量

时间:2016-03-05 11:57:42

标签: java javafx lambda final

我需要在中的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中使用。

3 个答案:

答案 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”值。