[size=x-large]Groovy:switch表达式[/size]
在Java里我们只能在switch语句中比较int或枚举类型。在Groovy中我们可以比较任何类型只要这个类型提供了isCase方法。Groovy已经为Class(利用isInstance),Object(利用equals),collections(利用contains)和正则表达式(利用matches),同样我们也可以为自己类实现isCase方法,这样也可以在switch语句中使用。最后我们还可以利用闭包来实现。比较需要返回boolean类型。
最后顺便提一下collection上的grep方法。在过滤时也是利用isCase方法实现的:
在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'