Groovy:switch表达式

Groovy:switch表达式

在Java里我们只能在switch语句中比较int或枚举类型。在Groovy中我们可以比较任何类型只要这个类型提供了isCase方法。Groovy已经为Class(利用isInstance),Object(利用equals),collections(利用contains)和正则表达式(利用matches),同样我们也可以为自己类实现isCase方法,这样也可以在switch语句中使用。最后我们还可以利用闭包来实现。比较需要返回boolean类型。
def testSwitch(val) {
    def result
    switch (val) {
        case ~/^Switch.*Groovy$/:
            result = 'Pattern match'
            break
        case BigInteger:
            result = 'Class isInstance'
            break
        case 60..90:
            result = 'Range contains'
            break
        case [21, 'test', 9.12]:
            result = 'List contains'
            break
        case [language:"groovy", version:"2.1"]:
            result = 'Map containsKey'
            break
        case 42.056:
            result = 'Object equals'
            break
        case { it instanceof Integer && it < 50 }:
            result = 'Closure boolean'
            break
        default:
            result = 'Default'
            break
    }    
    result
}

assert 'Pattern match' == testSwitch("Switch to Groovy")
assert 'Class isInstance' == testSwitch(42G)
assert 'Range contains' == testSwitch(70)
assert 'List contains' == testSwitch('test')
assert 'Map containsKey'== testSwitch('language') 
assert 'Object equals' == testSwitch(42.056)
assert 'Closure boolean' == testSwitch(20)
assert 'Default' == testSwitch('default')


最后顺便提一下collection上的grep方法。在过滤时也是利用isCase方法实现的:

assert [true] == ['test', 12, 20, true].grep(Boolean), 'Class isInstance'
assert ['Groovy'] == ['test', 'Groovy', 'Java'].grep(~/^G.*/), 'Pattern match'
assert ['b', 'c'] == ['a', 'b', 'c', 'd'].grep(['b', 'c']), 'List contains'
assert [15, 16, 12] == [1, 15, 16, 30, 12].grep(12..18), 'Range contains'
assert [42.031] == [12.300, 109.20, 42.031, 42.032].grep(42.031), 'Object equals'
assert [100, 200] == [10, 20, 30, 50, 100, 200].grep({ it > 50 }), 'Closure boolean'



你可能感兴趣的:(groovy)