問題復現
最近寫了一個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 - ''
}