在Java应用程序中使用groovy.lang.Closure



我想在Java应用程序中使用Groovy Closure类,但是遇到了比预期更多的麻烦。我有:

int count = 0;
groovy.lang.Closure closure = { count = 1 };

然而,当我尝试使用JDK 7编译这个时,我得到了错误:illegal initializer for Closure

我是否错过了一些非常明显的东西?谢谢你的帮助。

正如Oliver已经说过的,Java不支持这种语法。(免责声明:所有代码都未经测试)您可以这样做:

Closure closure = new Closure(null) {
  public Object doCall() {
    /* some code here */
  }
};

但是这不能让你在这个方法中设置count,因为这是一个Java匿名内部类,因此count必须是final。您可以使用任何类型的重定向绕过这一点,例如数组。或者您可以模仿Groovy的做法,使用以下命令:

import groovy.lang.*;
Reference count = new Reference(0);
Closure closure = new Closure(this) {
  public Object doCall() {
    count.set(1);
  }
};

上面已经有了答案,我只是添加了一个工作示例。

接受闭包的Groovy代码,
public class GroovyService {
    Integer doSomething(Closure<Integer> fn) {
        fn()
    }
}

从java调用groovy闭包

import groovy.lang.Closure;
public class JavaCanCallGroovy {
    public static void main(String[] args) {
        GroovyService service = new GroovyService();
        Integer data = service.doSomething(new Closure<Integer>(null) { //need to pass owner = null
            @Override
            public Integer call() {
                return 100;
            }
        });
        System.out.println(data);
    }
}

从scala调用groovy闭包

import groovy.lang.Closure
object ScalaCanCallGroovy extends App {
  private val closure = new Closure[Integer]() {
    override def call() = 1
  }
  val groovyService = new GroovyService
  val data = groovyService.doSomething(closure)
  assert(data == 1)
}

相关内容

最新更新