簡體   English   中英

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

[英]Using groovy.lang.Closure in Java application

我想在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()
    }
}

調用groovy閉包來自java,

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)
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM