优雅的方式做...在groovy

Mar*_*szS 50 groovy loops do-while

如何做这样的代码groovy

do {

  x.doIt()

} while (!x.isFinished())
Run Code Online (Sandbox Code Playgroud)

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

目前还没有'do ... while()'语法.

由于含糊不清,我们还没有增加对Groovy的支持

参考文献:

小智 61

你可以滚动你自己的循环几乎你想要的.这是一个例子,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()
      }
   }
}
Run Code Online (Sandbox Code Playgroud)

用法:

import static Looper.*

int i = 0
loop {
   println("Looping : "  + i)
   i += 1
} until { i == 5 }
Run Code Online (Sandbox Code Playgroud)

  • @Rao认为它是`loop({...}).until({...})`.所以`until()`在`loop()`的返回值上调用.Groovy命令表达式意味着你可以在`until()`前面省略`.`. (3认同)

tim*_*tes 22

根据你的用例,有这样的选项:在带有inputStream的Groovy中执行.. while()?

或者你可以这样做:

x.doIt()
while( !x.finished ) { x.doIt() }
Run Code Online (Sandbox Code Playgroud)

要么

while( true ) {
    x.doIt()
    if( x.finished ) break
}
Run Code Online (Sandbox Code Playgroud)

  • 经过第二次查看后,我认为第二个选项既简单又不错 (2认同)

top*_*opr 15

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

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

while ({
    x.doIt()
    !x.isFinished()
}()) continue
Run Code Online (Sandbox Code Playgroud)

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

continue可以使用分号而不是关键字.

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

Closure<Boolean> somethingToDo = { foo ->
    foo.doIt()
    !foo.isFinished()
}
Run Code Online (Sandbox Code Playgroud)

然后在别处:

while (somethingToDo(x)) continue
Run Code Online (Sandbox Code Playgroud)

以前我在这里提出了这个答案:在带有inputStream的Groovy中执行.. while()?

  • 它有很多不幸的括号和括号,但无论如何都是最优雅的方式,没有任何重复. (2认同)

Men*_*ene 6

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

从Groovy 2.6开始,启用新的Parrot Parser时支持do-while,默认情况下从Groovy 3.0开始。请参阅发行说明

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

  • 您是对的,感谢您的评论,我更新了答案! (2认同)

Gre*_*ant 5

您可以在常规while循环中使用条件变量:

def keepGoing = true
while( keepGoing ){
    doSomething()
    keepGoing = ... // evaluate the loop condition here
}
Run Code Online (Sandbox Code Playgroud)