代码之家  ›  专栏  ›  技术社区  ›  navy1978

SWT和Java 8 lambdas(Runnable和timerExec)

  •  2
  • navy1978  · 技术社区  · 7 年前

    我正在重构前一段时间参与的一个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)中的“this”指的是可运行对象,第二段代码中的“this”指的是主类,实际上,我在编译时遇到的错误如下:

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

    为了执行计时器,我如何解决这个问题?

    编辑: 查看StackOverflow之前的问题,我发现: Lambda this reference in java

    似乎不可能在lambda中引用“this”,所以我不能在lambda中使用SWT计时器?是否有变通方法?

    3 回复  |  直到 7 年前
        1
  •  4
  •   tsolakp    7 年前

    我不知道你为什么试图在lambda内部进行自我参考。通常,保持lambda表达式简短易读是一种很好的做法。只需从lambda调用一个私有方法,如下所示:

    Display.getCurrent().timerExec( 1000, () -> process() );
    
    private void process(){
        // do some stuff...
        Display.getCurrent().timerExec( 1000, () -> process() );
    }
    
        2
  •  2
  •   fps    7 年前

    如果您声明 Runnable 作为局部变量,则不能引用self 可运行的 lambda中的实例。

    但是,如果您声明 可运行的 作为类的属性,然后可以引用 可运行的 lambda中的实例:

    class SomeClass {
    
        private Runnable runnable2 = () -> { 
            // do some stuff...
            Display.getCurrent().timerExec(1000, this.runnable2);
        };
    }
    

    你是唯一知道这种方法是否值得尝试的人。。。

        3
  •  1
  •   DHa    7 年前

    这是一个“变通方法”,但它使事情不如原始代码那么清楚。我会保留原稿。

        Runnable[] runnable2 = {null}; 
        runnable2[0] = () -> { 
            // do some stuff...
            Display.getCurrent().timerExec(1000, runnable2[0]);
        };
        Display.getCurrent().timerExec(1000, runnable2[0]);