Groovy中String.split()空数组为何为真值?Jenkins是否有影响?
为什么Groovy中空数组的真值判断会有差异?
这是个很容易踩坑的Groovy细节,核心原因在于数组的类型、Groovy的真值判断规则,加上split方法的行为容易产生误解,咱们逐个拆解:
1. Groovy的真值判断规则
Groovy把任意值转为boolean的逻辑(真值判断)对不同容器类型区别对待:
- Groovy原生集合(List/Set/Map):比如直接写
[]创建的ArrayList,空集合会被视为false——Groovy会直接检查集合的元素数量是否为0。 - Java原生数组(如
String[]):Groovy会同时判断两个条件:数组对象是否为null,以及数组长度是否大于0。只有当数组是null或者长度为0时,才会被视为false;否则为true。
2. 你测试中的关键误解:split('\r\n')的返回值
你看到GroovyShell输出changedDirs.split('\r\n') ===> [],但实际上这个数组不是空的——当对空字符串调用split('\r\n')时,Java/Groovy的split规则会返回一个长度为1的String[],里面包含一个空字符串元素([""])。GroovyShell的简化输出把它显示为[],这才是导致真值判断为true的核心原因:这个数组的长度是1,不是0,所以Groovy认为它是“真”。
你可以用这段代码验证:
def result = ''.split('\r\n') println result.length // 输出1 println result[0] // 输出空字符串
3. 关于[] as String[]的行为
你测试里[] as String[] ? true : false ===> false是完全符合规则的:[] as String[]会创建一个长度为0的String[]数组,Groovy检查到它长度为0,所以真值判断为false。
4. Jenkins环境中的情况
Jenkins本身并没有对Groovy的真值判断做特殊修改,这个问题在Jenkins中出现的原因和本地GroovyShell完全一致:
- 当你在Jenkins Pipeline中处理空字符串的
split结果时,得到的是包含空字符串的长度为1的数组,所以真值判断为true,导致collect会处理这个空元素。 - 如果要避免这个问题,可以在
split后加上过滤逻辑,比如:
def changedDirs = '' def dirs = changedDirs.split('\r\n').findAll { it.trim() } // 过滤空/空白字符串 if (dirs) { // 处理非空的目录列表 }
内容的提问来源于stack exchange,提问作者Christian Bongiorno
相关产品推荐
相关产品推荐

