我正在重构我之前工作的SWT项目,我想使用Java 8,现在在当前版本中,我有类似的东西:
Runnable runnable = new Runnable() {
public void run() {
// do some stuff...
Display.getCurrent().timerExec(1000, this);
}
};
Display.getCurrent().timerExec(1000, runnable);
我尝试使用Java 8,就像这样:
Runnable runnable2 = () -> {
// do some stuff...
Display.getCurrent().timerExec(1000, this);
};
Display.getCurrent().timerExec(1000, runnable2);
问题在于:
Display.getCurrent().timerExec(1000, this);
"这"在第一个代码(不是Java 8)中引用的是Runnable Object,在第二个代码中引用的是主类,实际上我在编译时得到的错误如下:
Display类型中的方法timerExec(int,Runnable)不是 适用于参数(int,MainClass)
如何解决此问题,以便执行计时器?
修改 查看StackOverflow之前的问题,我发现了这个问题:Lambda this reference in java
似乎无法参考"这个"在lambda中,所以我不能使用带lambda的SWT计时器?有工作吗?
答案 0 :(得分:4)
我不确定你为什么要在lambda中自我引用。保持lambda表达式简洁易读通常是一种很好的做法。只需从你的lambda中调用一个私有方法,如下所示:
Display.getCurrent().timerExec( 1000, () -> process() );
private void process(){
// do some stuff...
Display.getCurrent().timerExec( 1000, () -> process() );
}
答案 1 :(得分:2)
如果您将Runnable
声明为本地变量,则无法在lambda中引用自Runnable
实例。
但是,如果您将Runnable
声明为类的属性,那么您可以在lambda中引用Runnable
实例:
class SomeClass {
private Runnable runnable2 = () -> {
// do some stuff...
Display.getCurrent().timerExec(1000, this.runnable2);
};
}
你是唯一一个知道是否值得尝试这种方法的人......
答案 2 :(得分:1)
这是一个解决方法',但它使事情不如原始代码清晰。我会保留原文。
Runnable[] runnable2 = {null};
runnable2[0] = () -> {
// do some stuff...
Display.getCurrent().timerExec(1000, runnable2[0]);
};
Display.getCurrent().timerExec(1000, runnable2[0]);