【问题标题】:Using groovy.lang.Closure in Java application在 Java 应用程序中使用 groovy.lang.Closure
【发布时间】:2015-11-24 12:15:01
【问题描述】:

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

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

但是,当我尝试使用 JDK 7 编译它时,我收到错误:illegal initializer for Closure

我是否遗漏了一些非常明显的东西?感谢您的帮助。

【问题讨论】:

  • Java 不支持闭包语法...

标签: java groovy closures


【解决方案1】:

正如 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);
  }
};

【讨论】:

    【解决方案2】:

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

    接受闭包的 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)
    }
    

    【讨论】:

      猜你喜欢
      • 2015-05-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-28
      • 2013-04-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多