如何在Groovy的each循环中使用“continue”

49

我是Groovy的新手(之前在Java上工作),尝试使用Spock框架编写一些测试用例。 我需要将以下Java代码片段使用“each循环”转换为Groovy代码片段。

Java代码片段:

List<String> myList = Arrays.asList("Hello", "World!", "How", "Are", "You");
for( String myObj : myList){
    if(myObj==null) {
        continue;   // need to convert this part in groovy using each loop
    }
    System.out.println("My Object is "+ myObj);
}

优雅代码示例:

def myObj = ["Hello", "World!", "How", "Are", "You"]
myList.each{ myObj->
    if(myObj==null){
        //here I need to continue
    }
    println("My Object is " + myObj)
}

可能是在Groovy闭包中模拟“continue”的最佳模式的重复问题。 - kriegaex
3个回答

82

可以使用return,因为闭包基本上是一个方法,每个元素作为参数调用该方法。

def myObj = ["Hello", "World!", "How", "Are", "You"]
myList.each{ myObj->
    if(myObj==null){
        return
    }
    println("My Object is " + myObj)
}

或将您的模式切换为

def myObj = ["Hello", "World!", "How", "Are", "You"]
myList.each{ myObj->
    if(myObj!=null){
        println("My Object is " + myObj)
    }
}

或者先使用 findAll 过滤掉 null 对象。
def myList = ["Hello", "World!", "How", "Are", null, "You"]
myList.findAll { it != null }.each{ myObj->
    println("My Object is " + myObj)
}

如果您担心首先需要迭代整个集合进行过滤,然后才开始使用each,那么您也可以利用Java流。

def myList = ["Hello", "World!", "How", "Are", null, "You"]
myList.stream().filter { it != null }.each{ myObj->
    println("My Object is " + myObj)
}

1
OP想要过滤条目,因此findAll {...}是这里的最佳答案+1。 - Alex
1
最后一个版本使用findAll看起来最好。但是那不是更耗时吗?你难道不是要两次遍历整个集合吗? - Yaerius
我认为这并不会比您迭代两次更耗费时间,因为您即使迭代两次也要执行相同的操作。但是each只有在过滤完成后才会开始。如果这是个问题,您可以利用Java流。我已经将其添加到答案中。 - Vampire

27

你可以使用标准的for循环,结合continue关键字:

for( String myObj in myList ){
  if( something ) continue
  doTheRest()
}

或者在each的闭包中使用return

myList.each{ myObj->
  if( something ) return
  doTheRest()
}

1
你只有在对象不为null时才能进入if语句。
def myObj = ["Hello", "World!", "How", "Are", "You"]
myList.each{ 
    myObj->
    if(myObj!=null){
        println("My Object is " + myObj)
    }
}

1
当在条件不满足时需要执行大量代码时,“continue”方法可以使代码更加清晰。 - Pablo Pazos

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接