你如何在groovy中嵌套迭代器?

Der*_*rek 20 groovy iterator loops

groovy支持任何类型的嵌套迭代器表示法吗?

在下面的例子中,我想以某种方式获取来自外部迭代器的projectName值到我的内部迭代器中.这可能不存储在变量中吗?在我的例子中,我得到一个runtuime错误,找不到"项目"

it.myprojects.project.each{
     println("Project name: " + it.projectName)
    it.myroles.role.each{
         Role role = new Role()
             role.setName(project.projectName)//how do I get projectName here without storting it in a variable in the outer loop?
    }
}
Run Code Online (Sandbox Code Playgroud)

Mic*_*rdt 29

这些it变量不是迭代器,它们是闭包参数.该名称it不是"iterator"的缩写,它的字面意思是"it",用作单参数闭包的默认名称.但是,您可以使用显式(因此不同的嵌套)名称,如下所示:

it.myprojects.project.each{ project ->
     println("Project name: " + project.projectName)
     project.myroles.role.each{ role->
         Role r= new Role()
         r.setName(project.projectName)
    }
}
Run Code Online (Sandbox Code Playgroud)

实际上,我建议不要使用该each方法,而是使用实际循环:

for(project in it.myprojects.project){
     println("Project name: " + project.projectName)
     for(role in project.myroles.role){
         Role r= new Role()
         r.setName(project.projectName)
    }
}
Run Code Online (Sandbox Code Playgroud)

这是更好的,因为闭包使代码更难调试,也可能更慢.在这种情况下,无论如何使用闭包并没有任何优势.

  • @Derek:听起来你正在进行货物编程,即尝试使用语法而不理解它的含义.难怪你很困惑.你真的需要阅读闭包,直到你理解"each"是一个方法,而不是语言关键字,花括号中的代码是作为参数传递给方法的闭包,而"it"是隐含的参数.每个方法调用时的闭包. (2认同)
  • 我不明白为什么显式循环会比使用 every 方法更好 - 这更多是个人风格和偏好的情况。 (2认同)

mfl*_*yan 20

感觉这应该工作:

it.myprojects.project.each{ project->
     println("Project name: " + project.projectName)
     it.myroles.role.each{
         Role role = new Role()
         role.setName(project.projectName)
    }
}
Run Code Online (Sandbox Code Playgroud)

此外,您可以使用owner变量引用外部闭包

it.myprojects.project.each{ 
     println("Project name: " + it.projectName)
     it.myroles.role.each{
         Role role = new Role()
             role.setName(owner.projectName)
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,如果你似乎只是在创建Role类的新实例,我没有看到迭代角色的原因.也许这样的事情会更简单:

it.myprojects.project.each{ 
     println("Project name: " + it.projectName)
     it.myroles.role.size().times {
         Role role = new Role()
         role.setName(owner.projectName)
    }
}
Run Code Online (Sandbox Code Playgroud)