优雅的方式做...在groovy

 波波微博1987_704 发布于 2023-02-06 16:16

如何做这样的代码groovy

do {

  x.doIt()

} while (!x.isFinished())

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

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

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

参考文献:

groovy - dev > 做的

从Classic迁移到JSR语法

Groovy文档 > 控制结构 > 循环

Rosetta Code > Loops/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()
      }
   }
}

用法:

import static Looper.*

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

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


tim_yates.. 22

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

或者你可以这样做:

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

要么

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


topr.. 15

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

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

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

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

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

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

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

然后在别处:

while (somethingToDo(x)) continue

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

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

    或者你可以这样做:

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

    要么

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

    2023-02-06 16:16 回答
  • 如此多的答案,而不是一个没有冗余调用的答案(一个在循环之前,其余的在其中),很遗憾.

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

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

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

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

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

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

    然后在别处:

    while (somethingToDo(x)) continue
    

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

    2023-02-06 16:16 回答
  • 你可以滚动你自己的循环几乎你想要的.这是一个例子,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 }
    

    2023-02-06 16:16 回答
  • 您可以在常规while循环中使用条件变量:

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

    2023-02-06 16:16 回答
  • 更新 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
    

    2023-02-06 16:16 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有