Domanda Come si fanno iteratori nidificati in groovy?


Groovy supporta qualsiasi tipo di notazione iteratore annidata?

Nell'esempio seguente, voglio in qualche modo ottenere il valore projectName, che proviene dall'iteratore esterno, nel mio iteratore interno. È possibile senza memorizzare una variabile? Nel mio esempio ottengo un errore di runtime che "project" non è stato trovato

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

19
2017-09-24 17:18


origine


risposte:


Sembra che questo dovrebbe funzionare:

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

Inoltre, puoi fare riferimento alla chiusura esterna usando il owner variabile

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

Tuttavia, non vedo un motivo per iterare sui ruoli se tutto ciò che si sta facendo è creare nuove istanze della classe Role. Forse qualcosa di simile sarà più semplice:

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

18
2017-09-24 22:09



quelli it le variabili sono non iteratori, lo sono chiusura parametri. Il nome it non è l'abbreviazione di "iteratore", significa letteralmente "esso", utilizzato come nome predefinito per le chiusure a parametro singolo. Tuttavia, puoi usare nomi espliciti (e quindi diversi nidificati) come questo:

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

In realtà, sconsiglio di usare il each metodo e utilizzare invece loop reali:

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

Questo è meglio perché le chiusure rendono il codice molto più difficile da eseguire il debug e anche potenzialmente più lento. E in questo caso, non c'è alcun vantaggio nell'utilizzo delle chiusure comunque.


28
2017-09-24 17:31



 it.projectList.each {...}

?

e questo: http://groovy.codehaus.org/Looping.

Fai un ciclo sulla lista, non sulla cosa nella lista. Sembra dal tuo codice che stai collegando la cosa nella lista.


0
2017-09-24 17:22