web-dev-qa-db-ja.com

groovyでネストされたイテレータをどのように実行しますか?

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

これはうまくいくはずだと感じています:

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)
    }
}
20
mfloryan

これらの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)
    }
}

実際には、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)
    }
}

クロージャはコードのデバッグを非常に難しくし、潜在的に遅くなるため、これはより良い方法です。そしてこの場合、とにかくクロージャを使用することに実際には何の利点もありません。

29
 it.projectList.each {...}

そしてこれ: http://groovy.codehaus.org/Looping

リスト内のものではなく、リスト上でループします。あなたのコードから、あなたはリストの中のものをループしているようです。

0
hvgotcodes