记录个Java/Groovy的小问题:空字符串调用split函数返回非空数组
问题复现
最近写了一个groovy替换程序增量流水线脚本(会Java也能看懂),示意脚本如下:
//获取文件列表方法 def listFiles(folder) { def output = sh(script: "ls ${folder}", returnStdout: true).trim() return output.split('\n') as List } //调用以上方法获取lib目录下的需添加的jar列表 def addJars = listFiles("lib") println "addJars值为"+addJars //List判空 if(addJars != null && !addJars.isEmpty()){ println "addJars列表长度="+addJars.size() for(addJar in addJars){ println "addJar="+addJar } }
最终输出结果:
addJars值为[] addJars列表长度=1 addJar=
哎?我的判空没生效么?!
分析
ls 目录
返回的字符串一般是\n文件1\n文件2\n
这种格式的字符串,用\n
分隔应该是没问题的。
继续分析output.split('\n') as List
这行,经过测试可以发现个现象:当output字符串为空字符串""
时,这个split方法转换的数组/列表是带有一个空字符串元素的!
可简化此处代码进行测试:
这个split方法是groovy继承java的String类型的方法,用Java写代码也有这个问题:
所以说,split方法当字符串为空字符串时会返回带有空字符串元素的数组!
解决
- 方案1:split后判断数组长度为1,且首个元素为空字符串时,返回一个空数组/列表。
- 方案2:split返回的数组去除空字符串元素。
我的解法采用了方案2,同时用上了groovy的运算符重载:
def listFiles(folder) { def output = sh(script: "ls ${folder}", returnStdout: true).trim() def list = output.split('\n') as List return list - '' }
本文作者:东北小狐狸
本文链接:https://www.cnblogs.com/hellxz/p/18554463
版权声明:本作品采用自由转载-非商用-非衍生-保持署名 (CC BY-NC-ND 3.0)许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
2022-11-19 Spring官方文档——1.概述(Overview)