使用for循环生成30个lambda表达式

时间:2016-11-27 18:01:22

标签: java for-loop javafx lambda

我想在鼠标点击上为30个对象创建事件集,所有这些对象都是这样做的:

for(int i=0;i<30;i++){
    seats[i].setOnMouseClicked(e->{
        seats[i].setEffect(lighting);       
    });
    }

但我一直收到这些错误:

error: local variables referenced from a lambda expression must be final or effectively final
        seats[i].setEffect(lighting);       

任何建议如何修复它而不是手动编写30次

2 个答案:

答案 0 :(得分:2)

您无法在lambda表达式中引用变量i,因为在执行lambda时它的值会发生变化。相反,做:

for(int i=0;i<30;i++){
    Node seat = seats[i];
    seat.setOnMouseClicked(e->{
        seat.setEffect(lighting);       
    });
}

这假定lighting明确final(即声明为final),&#34;有效最终&#34}; (即只分配一次值,因此可以声明final而不引入编译错误),或者是一个字段(不是局部变量)。

答案 1 :(得分:0)

在lambda表达式中,局部变量必须是最终的或有效的最终

这意味着您无法对lambda中使用的局部变量进行赋值,其中local表示在包含lambda表达式的方法范围中定义的

这样做工作:

//in method
int a = 5;
x.setOnMouseClicked(e->{
   a = a + 5 // <-- assignment       
});

这两个都没有:

//in method
for(int a = 0; a < 10; a++) { // <-- assignment
   x.setOnMouseClicked(e->{
      x.doSomething(a); // <-- a is not effectively final  
   });
}

这有效:

// in class
private int a = 5;

// in method
x.setOnMouseClicked(e->{
   a = a + 5 // <-- works since a is not a local variable   
});

这也有效:

// in method
MyObj o = new MyObj(); // object with member public int a;

x.setOnMouseClicked(e->{
   o.a = o.a + 5 // o is a local variable, but o is not reassigned, only a is.       
});