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

在Java应用程序中使用groovy.lang.Closure,java,groovy,closures,Java,Groovy,Closures,我希望在Java应用程序中使用Groovy闭包类,但遇到的问题比预期的要多。以下是我所拥有的: int count = 0; groovy.lang.Closure closure = { count = 1 }; 然而,当我尝试使用JDK 7编译此代码时,我得到了一个错误:用于闭包的非法初始值设定项 我是不是错过了一些很明显的东西?谢谢您的帮助。正如Oliver所说,Java不支持这种语法。(免责声明:所有未经测试的代码)您可以执行以下操作: Closure closure = new Cl

我希望在Java应用程序中使用Groovy闭包类,但遇到的问题比预期的要多。以下是我所拥有的:

int count = 0;
groovy.lang.Closure closure = { count = 1 };
然而,当我尝试使用JDK 7编译此代码时,我得到了一个错误:
用于闭包的非法初始值设定项


我是不是错过了一些很明显的东西?谢谢您的帮助。

正如Oliver所说,Java不支持这种语法。(免责声明:所有未经测试的代码)您可以执行以下操作:

Closure closure = new Closure(null) {
  public Object doCall() {
    /* some code here */
  }
};
但这不允许您在这个方法中设置count,因为这是一个Java匿名内部类,所以count必须是最终的。您可以通过任何类型的重定向(例如数组)绕过此问题。或者您模仿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()
    }
}
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);
    }
}

Java中不支持闭包语法。。。
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)
}