如何在groovy
中执行类似的代码?
do {
x.doIt()
} while (!x.isFinished())
因为groovy中有 no do ... while
语法。
还没有'做... while()'语法。
由于含糊不清,我们还没有添加支持do ..而Groovy
参考文献:
答案 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()
}
}]
}