Groovy嵌套Map遍历问题:如何动态拼接所有Bin路径?
动态拼接多Bin路径的Groovy代码修改
现有Groovy代码遍历bins列表时,每次循环都会覆盖binPath变量,最终仅保留最后一个bin的路径。需要修改代码实现动态收集所有bin的路径,输出格式为path/to/bin/tStamp/abc/int.bin,path/to/bin/tStamp/abc/ext.bin,path/to/bin/tStamp/def/int.bin,path/to/bin/tStamp/def/ext.bin,同时适配动态数量的bins。
原代码
def bins = ['abc','def','ghf'] bins.each{bin -> def binsToAdd = [ "$bin": "get${bin}ToAdd(getSwModule(), path) ] binPath = binsToAdd.findAll{it.key=="$bin"}.collect{ item -> def comp = item.key def tars = item.value tars.collect { tar -> def zipName = tar.tarName def files = tar.fileNames files.collect { "$binFilesPath/$comp/$tarName!/$it" }.join(',') }.join(',') }.join(',') } def getAbcToAdd (program, tStamp) { def binToAdd = [:] binToAdd.int = [ [ archiveName: "${program}_${tStamp}.tar", fileNames: ['int.bin'] ] ] binToAdd.ext = [ [ archiveName: "${program}_${tStamp}.tar", fileNames: ['ext.bin'] ] ] return binToAdd."$program" } def getDefToAdd (program, tStamp) { def binToAdd = [:] binToAdd.int = [ [ archiveName: "${program}_${tStamp}.tar", fileNames: ['int.bin'] ] ] binToAdd.ext = [ [ archiveName: "${program}_${tStamp}.tar", fileNames: ['ext.bin'] ] ] return binToAdd."$program" }
修改要点
- 避免变量覆盖:初始化
binPath为ArrayList,每次循环将当前bin的路径加入列表,而非直接赋值字符串。 - 修复语法错误:原代码中
get${bin}ToAdd(getSwModule(), path)的引号未闭合,且需要实际调用方法而非存储字符串。 - 动态方法调用:通过
this."get${bin.capitalize()}ToAdd"(...)的方式动态调用对应方法,适配任意数量的bins。 - 简化路径收集逻辑:去掉冗余的
findAll操作,直接处理当前bin对应的方法返回值。
修改后的完整代码
def bins = ['abc','def','ghf'] def binPath = [] // 初始化列表存储所有路径 def binFilesPath = "path/to/bin/tStamp" // 假设该变量已定义 def swModule = getSwModule() // 提前获取模块信息 def path = "your_tStamp_value" // 假设tStamp对应path变量 bins.each { bin -> // 动态调用对应getXXXToAdd方法 def tars = this."get${bin.capitalize()}ToAdd"(swModule, path) if (tars) { // 确保方法返回有效数据 tars.each { tar -> tar.fileNames.each { file -> // 拼接路径并加入列表 binPath.add("$binFilesPath/$bin/$file") } } } } // 将列表转为逗号分隔的字符串 def finalBinPath = binPath.join(',') println(finalBinPath) // 方法实现保持不变,可按需扩展 def getAbcToAdd (program, tStamp) { def binToAdd = [:] binToAdd.int = [ [ archiveName: "${program}_${tStamp}.tar", fileNames: ['int.bin'] ] ] binToAdd.ext = [ [ archiveName: "${program}_${tStamp}.tar", fileNames: ['ext.bin'] ] ] return binToAdd."$program" } def getDefToAdd (program, tStamp) { def binToAdd = [:] binToAdd.int = [ [ archiveName: "${program}_${tStamp}.tar", fileNames: ['int.bin'] ] ] binToAdd.ext = [ [ archiveName: "${program}_${tStamp}.tar", fileNames: ['ext.bin'] ] ] return binToAdd."$program" } // 补充ghf对应的方法(如果需要) def getGhfToAdd (program, tStamp) { def binToAdd = [:] binToAdd.int = [ [ archiveName: "${program}_${tStamp}.tar", fileNames: ['int.bin'] ] ] return binToAdd."$program" }
关键说明
- 原代码中方法返回的字段是
archiveName,但原逻辑里写的是tar.tarName,这里做了修正。 - 路径拼接直接使用
$binFilesPath/$bin/$file即可,符合期望输出格式,无需保留tar包路径。 - 通过
this."get${bin.capitalize()}ToAdd"动态调用方法,新增bin时只需添加对应的getXXXToAdd方法即可,无需修改主逻辑。
内容的提问来源于stack exchange,提问作者ek777
相关产品推荐
相关产品推荐

