Kotlin如何基于公共属性合并多环境Pod版本列表生成指定数据类
实现方案
首先抽离通用的CSV解析逻辑,再基于API名称做跨环境合并,后续新增环境仅需少量改动即可适配:
1. 定义通用解析函数
把所有环境共用的字符串解析逻辑抽成独立函数,输入CSV字符串直接返回API名称-版本号的键值对映射:
/** * 解析接口返回的CSV字符串,转换为 API名称 对应 版本号 的Map */ fun parsePodVersionMap(csv: String): Map<String, String> { return csv.split(",") .map { it.substringAfterLast("/") } .associate { podStr -> // 按第一个冒号拆分,避免版本号里带冒号的异常情况 val (apiName, version) = podStr.split(":", limit = 2) apiName to version } }
2. 解析各环境版本数据
不管新增多少个环境,都只用调用上面的解析函数即可,无重复代码:
// 解析现有环境的版本 val testVersionMap = parsePodVersionMap(execGetPodsOne()) val sitVersionMap = parsePodVersionMap(execGetPodsTwo()) // 后续新增环境仅需加一行,例如UAT环境:val uatVersionMap = parsePodVersionMap(execGetPodsUat())
3. 合并生成目标数据类实例
取所有环境的API名称并集,逐个匹配各环境的版本号生成ImageVersions实例:
// 先定义你的数据类,新增环境时加对应字段即可 data class ImageVersions( val apiName: String, val testPodVersion: String, val sitPodVersion: String, // 新增环境时加字段,例如:val uatPodVersion: String ) // 取所有环境的全部API名称去重,避免某环境缺失API导致漏数据 val allApiNames = (testVersionMap.keys + sitVersionMap.keys).distinct() // 新增环境时把对应Map的keys也加进去,例如+ uatVersionMap.keys val resultList: List<ImageVersions> = allApiNames.map { apiName -> ImageVersions( apiName = apiName, testPodVersion = testVersionMap[apiName] ?: "N/A", // 缺失版本默认返回N/A,可按需调整 sitPodVersion = sitVersionMap[apiName] ?: "N/A", // 新增环境时加对应赋值,例如:uatPodVersion = uatVersionMap[apiName] ?: "N/A" ) }
可选:更高扩展性的实现
如果不想每次新增环境都修改ImageVersions的结构,可以把版本字段换成环境到版本的映射,后续新增环境完全不用改数据类定义:
data class ImageVersions( val apiName: String, // key为环境标识,例如test/sit/uat,value为对应版本号 val envVersions: Map<String, String> ) // 合并逻辑调整为 val envMap = mapOf( "test" to testVersionMap, "sit" to sitVersionMap, // 新增环境仅需加这一行 ) val allApiNames = envMap.values.flatMap { it.keys }.distinct() val resultList = allApiNames.map { apiName -> ImageVersions( apiName = apiName, envVersions = envMap.mapValues { (_, versionMap) -> versionMap[apiName] ?: "N/A" } ) }
内容的提问来源于stack exchange,提问作者Richie
相关产品推荐
相关产品推荐

