2017-01-26 135 views
0

我有一個開關的情況下是這樣的:如何優化開關盒?

def someString = 'hello1234bla' 

// ... 

switch (someString) { 
    case {it.contains('1234')}: 
     doSomething() 
     break 
    case {it.contains('2468')}: 
     doSomethingElse() 
     break 
    default: 
     throw new Exception("ERROR: Number not found") 
     break 
} 

這似乎是東西這麼看似簡單的相當多的代碼。我想要的是當someString包含特定的子字符串時,可以執行不同的功能。有沒有更簡單的方法來做到這一點,除了可能是一個if-else級聯?

+0

如何使用地圖,存儲您的功能,並通過該地圖中的每個元素輸入一個數字循環並調用相匹配的函數?我不知道Groovy是否有這樣一種數據類型,但是這個概念在Java等中是可能的。 –

+2

@Krazor:在groovy中,它的東西就像這樣的{{{{}} {do,foo} (someThing.contains(s))fn()}' – cfrick

+0

Yeiks,現在這對我來說不是非常可讀。無論如何,這樣做會使您能夠快速關聯和更改用戶輸入和相應的功能。 –

回答

2

這是非常接近上面什麼意見建議,但我會寫出來與壓痕等工作的例子,也許這將是一個有點更具可讀性:

def someString = "hello1234bla" 

def found = [ 
    '1234': { println "do something" }, 
    '2468': { println "do something else" } 
].find { pattern, action -> 
    if (someString.contains(pattern)) { action(); true } 
    else false 
} 

if (!found) throw new Exception("ERROR: Number not found") 

這個執行第一個匹配的行動如果沒有找到匹配項則拋出異常。如果您需要爲每場比賽執行一次操作,請將find呼叫替換爲findAll呼叫。

根據該串中的模式執行代碼的另一種方法是在常規字符串eachMatch方法:

def someString = "hello1234blae" 

someString.eachMatch(/1234/) { println "do something" } 
someString.eachMatch(/2468/) { println "do something else" } 

其使用正則表達式和運行封閉件(在eachMatch呼叫後的花括號塊)一次每場比賽。因此:

someString.eachMatch(/e/) { println "runs twice" } 

上面的字符串會執行兩次,因爲字符串中有兩個'e'字符。