2017-01-26 4 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()}}과 같은 것. 각 {s, fn -> if (someThing.contains (s)) fn()}' – cfrick

+0

Yeiks, 이제는별로 읽을 수 없어요. Non-less-less 방식을 사용하면 사용자 입력과 해당 기능을 신속하게 연결하고 변경할 수 있습니다. –

답변

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") 

이 일치하는 첫 번째 작업을 실행 일치하는 것이 발견되지 않는 경우는 예외를 Throw합니다. 모든 일치 항목에 대해 작업을 실행해야하는 경우 find 호출을 findAll 호출로 바꿉니다. 폐쇄합니다 (eachMatch 호출 후 중괄호의 블록을) 정규 표현식을 사용하여 실행

def someString = "hello1234blae" 

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

번 :

문자열의 패턴을 기반으로 코드를 실행하는 또 다른 방법은 끝내 문자열 eachMatch 방법입니다 매치마다. 따라서 : 위의 문자열에 두 개의 'e'문자가 있기 때문에 위의 문자열에 대해 두 번째로 실행됩니다.

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

관련 문제