You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

修改要点

  1. 避免变量覆盖:初始化binPath为ArrayList,每次循环将当前bin的路径加入列表,而非直接赋值字符串。
  2. 修复语法错误:原代码中get${bin}ToAdd(getSwModule(), path)的引号未闭合,且需要实际调用方法而非存储字符串。
  3. 动态方法调用:通过this."get${bin.capitalize()}ToAdd"(...)的方式动态调用对应方法,适配任意数量的bins。
  4. 简化路径收集逻辑:去掉冗余的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 00:20:42