SWT和Java 8 lambdas(Runnable和timerExec)

时间:2018-01-23 23:37:37

标签: java lambda swt

我正在重构我之前工作的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);

"这"在第一个代码(不是J​​ava 8)中引用的是Runnable Object,在第二个代码中引用的是主类,实际上我在编译时得到的错误如下:

  

Display类型中的方法timerExec(int,Runnable)不是   适用于参数(int,MainClass)

如何解决此问题,以便执行计时器?

修改 查看StackOverflow之前的问题,我发现了这个问题:Lambda this reference in java

似乎无法参考"这个"在lambda中,所以我不能使用带lambda的SWT计时器?有工作吗?

3 个答案:

答案 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]);