Groovy技术疑问:GString无法匹配字符串集合元素的原因
Groovy字符串插值匹配数组异常问题解析
先看你遇到的代码场景:
def str = "app-dev" def env = str.split('-')[1] println(env + " length: " + env.length()) // prints dev length: 3 println(env in ['dev', 'qa']) // prints true, works as expected. def _env = "${str.split('-')[1]}" // string interpolation or GString println(_env + " length: " + _env.length()) // prints dev length: 3 println(_env in ['dev', 'qa']) // prints false, why ? println(_env.trim() in ['dev', 'qa']) // prints true :|
问题根源:GString与Java String的类型差异
直接提取的
env是Java String:str.split('-')[1]返回的是标准java.lang.String实例,和数组里的"dev"(同样是String类型)做相等性比较时,仅需内容一致即可匹配,所以env in ['dev', 'qa']返回true。插值得到的
_env是Groovy GString:用"${...}"语法生成的是groovy.lang.GString类型对象。Groovy中GString的equals()方法会先检查对象类型:只有当对比双方都是GString时,才会比较内容;如果对方是Java String,直接返回false。这就导致_env in ['dev', 'qa']判断不成立。trim()触发类型转换:调用trim()方法时,Groovy会自动将GString转换为Java String(因为trim()是String类的方法),此时转换后的对象和数组里的String类型元素内容、类型都匹配,所以_env.trim() in ['dev', 'qa']返回true。
你可以通过打印类型验证这一点:
println(env.getClass()) // 输出:class java.lang.String println(_env.getClass()) // 输出:class groovy.lang.GString println(_env.trim().getClass()) // 输出:class java.lang.String
内容的提问来源于stack exchange,提问作者Kamalakannan J
相关产品推荐
相关产品推荐

