Groovy如何根据变量类型设置判断条件 零值空值不传递参数
Groovy条件判断实现类型分支与空值拦截
原代码核心问题
- 类型判断逻辑错误:直接将对象和类名字符串做等值比较完全无法匹配类型,Groovy判断对象类型需要用
instanceof操作符,或直接比对对象.class和目标类 - 分支结构错误:两个独立
if没有互斥关系,会出现逻辑重复执行;else后直接追加条件是语法错误,多条件分支需要用else if - 方法调用错误:List类型分支中把List对象当方法调用写
aditionalArgs("--build-arg", ""),会直接抛MissingMethodException;且对List对象调用String专属的replace、split方法也会报错 - 空值判断缺失:没有统一拦截空值、0值的入口,空场景下仍会进入处理逻辑
正确实现方案
先做统一空值拦截,Groovy的默认真值规则可以一次性覆盖所有空场景:null、空字符串、空集合、数值0都会被判定为假,直接返回空内容不传递参数;之后通过instanceof做类型分支,分别处理String和List类型的入参,不会出现类型混淆。
// 可自行切换不同测试场景验证 // aditionalArgs = "test1 = add1 , tets2= add2 " // aditionalArgs = ["test1=arg1", "test2=arg2"] // aditionalArgs = 0 // aditionalArgs = "" // aditionalArgs = [] aditionalArgs = ["test1=arg1", "test2=arg2"] def args = "" // 第一步:统一拦截空/0值场景,直接终止逻辑不传递任何内容 if (!aditionalArgs) { println "empty aditionalArgs" return } // 第二步:按类型走对应互斥处理分支 if (aditionalArgs instanceof String) { // String类型处理:清理冗余前缀、按逗号拆分后拼接参数 def paramList = aditionalArgs.replace("--build-arg", "").split(',').collect{ it.trim() } paramList.each { val -> if (val) args += " --build-arg $val" } } else if (aditionalArgs instanceof List) { // List类型处理:直接遍历列表元素拼接,不需要调用字符串专属方法 aditionalArgs.each { val -> if (val) args += " --build-arg $val" } } println args.trim()
关键说明
- 不要用硬编码类名字符串判断类型,
instanceof可以兼容所有目标类型的子类实现,比如不管是ArrayList还是LinkedList,只要是List类型都能进入对应分支 - Groovy的真值判断
!变量可以覆盖所有需要拦截的空场景:null、0、空字符串、空集合、空Map都会被判定为false,不需要单独写多个重复判断条件 - 不同类型的处理逻辑完全隔离,不会出现对List调用String方法的类型错误
内容的提问来源于stack exchange,提问作者Dmitrii Seleznev
相关产品推荐
相关产品推荐

