記錄個Java/Groovy的小問題:空字串呼叫split函式返回非空陣列

东北小狐狸發表於2024-11-19

問題復現

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

相關文章