Groovy中缺少generator/yield关键字的解决方法

wrs*_*der 9 groovy

想知道是否有一种方法可以sql.eachRow像生成器一样使用它,以便在需要Collection或Iterator的DSL上下文中使用它.我正在尝试使用的用例是流式JSON生成 - 我正在尝试做的是:

def generator = { sql.eachRow { yield it } }
jsonBuilder.root {
  status "OK"
  rows generator()
}
Run Code Online (Sandbox Code Playgroud)

bla*_*rag 3

您需要持续的支持(或类似的支持)才能使其在某种程度上发挥作用。Groovy 没有延续,JVM 也没有。通常,延续传递风格是有效的,但方法eachRow必须支持这一点,但它当然不支持。所以我看到的唯一方法是使用线程或类似的东西的临时解决方案。所以也许类似的东西对你有用:

def sync = new java.util.concurrent.SynchronousQueue()
Thread.start { sql.eachRow { sync.put(it) } }
jsonBuilder.root {
  status "OK"
  rows sync.take()
}
Run Code Online (Sandbox Code Playgroud)

我并不是说这是一个很好的解决方案,只是针对您的问题的随机消费者生产者解决方法。