2016-11-27 107 views
1

我想创建一个事件上的鼠标点击30个对象设定他们都做同样产生30 lambda表达式:使用循环

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

你不能在lambda表达式中引用变量i,因为它的值在lambda被执行时会改变编辑。相反,这样做:

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

这是假定lighting是明确地final(即声明为final),“有效终”(即只赋值一次,因此可以宣布final不会引入编译错误)或者是一个字段(不是局部变量)。

0

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

这意味着,你不能让分配在一个lambda,当地手段在包含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.  
}); 
+1

作业与它有什么关系?你不能*访问lambda表达式中的一个非最终(或非有效的)最终局部变量。 OP甚至不会尝试在问题中的lambda表达式中分配任何内容。 –

+0

@James_D真的我不清楚。我澄清了我的答案。 – Mattias