【问题标题】:Edit a local variable inside java lambda在 java lambda 中编辑局部变量
【发布时间】:2016-03-05 11:57:41
【问题描述】:

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

【问题讨论】:

  • @AndrewTobilko 你引用了他的话。
  • q 设为类实例字段。
  • 你想在哪里增加值?如果您只需要“在循环中”执行此操作,则无需在 lambda 表达式中执行此操作即可。如果您需要一个值为 q 的最终变量,只需复制它:final int pNumber = q; 然后portNum = pNumber; 就可以了。

标签: javafx java javafx lambda final


【解决方案1】:

我认为您正在寻找类似的东西

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

【讨论】:

  • 我想他是想改变lambda体内的变量,否则他没有编译错误。
  • @AndrewTobilko 不正确。 q++ 写入 q 因此 q 不是有效的最终结果。 @James_D 你可以把那个变量设为final。在这里保持有效的最终状态是没有意义的。
  • 它成功了,谢谢伙计:)你能解释一下你是如何修复它的以及为什么我们必须在 lambda 中使用 final 吗?
  • @a.ghad : lambda/anonymus 类只能有效地访问最终/最终变量(语言设计选择;一旦它位于comPorts.length BTW,您就不想访问该值)。将变量值复制到循环体内的新变量意味着不需要更改新变量的值,因此可以有效地保持最终状态。但是你应该在变量声明中添加一个final,因为这会增加编译时间/IDE检查,而且效果应该很清楚而无需添加注释。
【解决方案2】:

你可以做一个整数制表符并使用第一个索引来增加。 在 lambda 中捕获变量,因此引用必须是最终的。 所以引用不能被其他引用代替。为此,我们应该使用一个包含 int 值的对象数组。

【讨论】:

  • 你会怎么做?
  • int[] value = new int[1];值[0]
【解决方案3】:

如果您愿意使用 apache commons,Mutable* 系列类为闭包友好的值“装箱”提供了一个很好的机制,因为框架提供的大写字母框没有。

对于上述情况,将 q 替换为 MutableInt 即可。

也就是说,对于这个特定的示例,您可能会通过为 portsItems 使用(可变长度)列表,并为相应的“端口”值使用 add() 和 size() - 1 的组合来获得更好的结果。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多