Elegant way for do ... while in groovy

LoopsGroovyDo While

Loops Problem Overview


How to do code something like this in groovy?

do {

  x.doIt()

} while (!x.isFinished())

Because there is no do ... while syntax in groovy.

> No 'do ... while()' syntax as yet. > > Due to ambiguity, we've not yet added support for do .. while to Groovy

References:

Loops Solutions


Solution 1 - Loops

You can roll your own looping that's almost what you want. Here's an example with loop { code } until { condition } You can't have a corresponding loop { code } while { condition } because while is a keyword. But you could call it something else.

Anyway here's some rough and ready code for loop until. One gotcha is you need to use braces for the until condition to make it a closure. There may well be other issues with it.

class Looper {
   private Closure code

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

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

Usage:

import static Looper.*

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

Solution 2 - Loops

So many answers and not a single one without a redundant call, a shame ;)

This is the closest it can get to purely language syntax based do-while in Groovy:

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

The last statement within curly braces (within closure) is evaluated as a loop exit condition.

Instead of continue keyword a semicolon can be used.

Additional nice thing about it, loop can be parametrized (kind of), like:

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

and then elsewhere:

while (somethingToDo(x)) continue

Formerly I've proposed this answer over here: https://stackoverflow.com/questions/8188641/do-while-in-groovy-with-inputstream/22057667#22057667

Solution 3 - Loops

Depending on your use case, there are options like this: https://stackoverflow.com/questions/8188641/do-while-in-groovy

Or you can do:

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

Or

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

Solution 4 - Loops

You can use a condition variable with the regular while loop:

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

Solution 5 - Loops

Update Groovy 2.6 has been abandoned to concentrate on 3.0.

From Groovy 2.6 on, do-while is supported when enabling the new Parrot Parser, from Groovy 3.0 on this is the default. See [release notes][1]:

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

[1]: http://groovy-lang.org/releasenotes/groovy-2.6.html "release notes"

Solution 6 - Loops

Or you can implement it in a Groovier way :

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

Solution 7 - Loops

By now, Groovy has support for do/while:

do {

  x.doIt()

} while (!x.isFinished())

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionMariuszSView Question on Stackoverflow
Solution 1 - LoopsSteve SowerbyView Answer on Stackoverflow
Solution 2 - LoopstoprView Answer on Stackoverflow
Solution 3 - Loopstim_yatesView Answer on Stackoverflow
Solution 4 - LoopsGreenGiantView Answer on Stackoverflow
Solution 5 - LoopsMeneView Answer on Stackoverflow
Solution 6 - LoopsCao CaoView Answer on Stackoverflow
Solution 7 - LoopsBenedikt KöppelView Answer on Stackoverflow