优雅的方式做...在groovy

时间:2014-01-04 13:20:14

标签: loops groovy do-while

如何在groovy中执行类似的代码?

do {

  x.doIt()

} while (!x.isFinished())

因为groovy中有 no do ... while语法

  

还没有'做... while()'语法。

     

由于含糊不清,我们还没有添加支持do ..而Groovy

参考文献:

6 个答案:

答案 0 :(得分:58)

你可以滚动自己的循环,这几乎就是你想要的。 这是loop { code } until { condition }的示例 您不能拥有相应的loop { code } while { condition },因为while是关键字。 但你可以称之为别的东西。

无论如何,这里有一些粗略的,准备好的循环代码,直到。 一个问题是你需要使用大括号作为until条件才能使它成为一个闭包。 它可能还有其他问题。

class Looper {
   private Closure code

   static Looper loop( Closure code ) {
      new Looper(code:code)
   }

   void until( Closure test ) {
      code()
      while (!test()) {
         code()
      }
   }
}

用法:

import static Looper.*

int i = 0
loop {
   println("Looping : "  + i)
   i += 1
} until { i == 5 }

答案 1 :(得分:20)

根据您的使用情况,有以下选项:do .. while() in Groovy with inputStream?

或者你可以这样做:

x.doIt()
while( !x.finished ) { x.doIt() }

或者

while( true ) {
    x.doIt()
    if( x.finished ) break
}

答案 2 :(得分:11)

如此多的答案,而不是一个没有冗余调用的答案(一个在循环之前,其余的在其中),很遗憾。

这是Groovy中基于 do-while 的纯语言语法最接近的:

while ({
    x.doIt()
    !x.isFinished()
}()) continue

大括号内的最后一个语句(在闭包内)被评估为循环退出条件。

可以使用分号代替continue关键字。

关于它的其他好处,循环可以参数化(种类),如:

Closure<Boolean> somethingToDo = { foo ->
    foo.doIt()
    !foo.isFinished()
}

然后在其他地方:

while (somethingToDo(x)) continue

以前我在这里提出了这个答案:do .. while() in Groovy with inputStream?

答案 3 :(得分:5)

更新 Groovy 2.6已被放弃专注于3.0。

从Groovy 2.6开始,在启用新的Parrot Parser时支持do-while,从Groovy 3.0开始,这是默认设置。见release notes

// classic Java-style do..while loop
def count = 5
def fact = 1
do {
    fact *= count--
} while(count > 1)
assert fact == 120

答案 4 :(得分:4)

您可以将条件变量与常规while循环一起使用:

def keepGoing = true
while( keepGoing ){
    doSomething()
    keepGoing = ... // evaluate the loop condition here
}

答案 5 :(得分:1)

或者您可以使用Groovier方式实现它:

def loop(Closure g){
    def valueHolder = [:]
    g.delegate = valueHolder
    g.resolveStrategy = Closure.DELEGATE_FIRST
    g()
    [until:{Closure w ->
        w.delegate = valueHolder
        w.resolveStrategy = Closure.DELEGATE_FIRST
        while(!w()){
        g()
        }
        }]
}