2017-01-26 6 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では、このような{{1234:{doSomething()}} each {s、fn - > if (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方法であってマッチごとにしたがって、上記の文字列の2つの 'e'文字が2つ存在するため、

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

が2回実行されます。

関連する問題