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

时间:2010-09-24 17:18:22

标签: loops groovy iterator

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?
    }
}

3 个答案:

答案 0 :(得分:29)

那些it变量是不是迭代器,它们是closure参数。名称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)
    }
}

实际上,我建议不要使用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)
    }
}

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

答案 1 :(得分:20)

感觉这应该有效:

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

此外,您可以使用owner变量

引用外部闭包
it.myprojects.project.each{ 
     println("Project name: " + it.projectName)
     it.myroles.role.each{
         Role role = new Role()
             role.setName(owner.projectName)
    }
}

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

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

答案 2 :(得分:0)

 it.projectList.each {...}

和此:http://groovy.codehaus.org/Looping

你循环列表,而不是列表中的东西。从您的代码中看,您正在循环查看列表中的内容。