Java & Groovy & Scala & Kotlin - 20.Switch 與模式匹配

Overview

本章主要介紹高級(jí)條件語(yǔ)句中的 switch 語(yǔ)句以及其增強(qiáng)版的模式匹配。

Java 篇

Switch

特點(diǎn)

  • Java 中 switch 語(yǔ)句功能類似 if,但是 switch 主要用在多條件分支上。
  • switch 語(yǔ)句由 case 分支和 default 組成,case 分支用于檢查條件,且參數(shù)必須為常量,default 用于執(zhí)行當(dāng)任何 case 分支都不匹配時(shí)執(zhí)行的語(yǔ)句。
  • switch 語(yǔ)句 在 Java 1.7 以前只支持基本類型,Java 1.7 開(kāi)始支持 String
  • 執(zhí)行時(shí) switch 語(yǔ)句會(huì)從上而下檢查與 case 條件是否一致,一旦發(fā)現(xiàn)相等的分支,switch 語(yǔ)句就會(huì)執(zhí)行該條 case 分支下的語(yǔ)句,并且之后會(huì)忽略下面的所有 case 分支,直到遇到 break 才會(huì)停止執(zhí)行。

例:

int i = 5 + 5;
switch (i) {
    case 1:
        System.out.println("i is 1");
    case 10:
        System.out.println("i is 10");
    case 100:
        System.out.println("i is 100");
    case 1000:
        System.out.println("i is 1000");
        break;
    case 10000:
        System.out.println("i is 10000");
    default:
        System.out.println("default");
}

以上語(yǔ)句的輸出結(jié)果為

i is 10
i is 100
i is 1000

Groovy 篇

Switch

Groovy 的 switch 語(yǔ)句類似 Java,但是 Groovy 除了支持基本類型,也支持引用類型,包含,正則匹配等各種操作。

例:

static def testSwitch(var) {
    def result
    switch (var) {
        case 0:
            result = "Object equals"
            break
        case 11..20:
            result = "Range contains"
            break
        case [1, 2, 3]:
            result = "List contains"
            break
        case Float:
            result = "Class instance"
            break
        case { it % 3 == 0 }:
            result = "Closure"
            break
        case ~'[0-9]{3}':
            result = "Pattern match"
            break
        default:
            result = "Default"
            break
    }
    result
}

assert "Object equals" == testSwitch(0)
assert "Range contains" == testSwitch(15)
assert "List contains" == testSwitch(3)
assert "Class instance" == testSwitch(4.5f)
assert "Closure" == testSwitch(21)
assert "Pattern match" == testSwitch(910)

以上語(yǔ)句的輸出結(jié)果為

i is 10
i is 100
i is 1000

Scala 篇

模式匹配

Scala 沒(méi)有 switch 語(yǔ)句,但是有類似功能的模式匹配。模式匹配的語(yǔ)法在外觀上有些像 Java 的 switch 語(yǔ)句,但是沒(méi)有 break 語(yǔ)句,在功能上則比 Java 的 switch 語(yǔ)句要強(qiáng)大很多。

例:

def matchObject(foo: Any): String = {
    val result = foo match {
      case 0 => "Object equals"
      case i if i == 10 || i == 11 => "Expression"
      case i: Int => s"Class instance holds $i"
      case List(1, 2, _*) => "Match the last element of a list"
      case Number(n) => s"Case class holds $n"
      case t: {def length: Int} => "Class structure contains method length"
      case _ => "Default"
    }
    result
}

println(matchObject(0)) //  Object equals
println(matchObject(10)) //  Expression
println(matchObject(20)) //  Class instance holds 20
println(matchObject(List(1, 2, 1000, 2000))) //  Match the last element of a list
println(matchObject(Number(1))) //  Case class holds 1
println(matchObject(List(3, 2, 1000, 2000))) //  Method contains

除了以上示例,模式匹配還可以用在 try...catch 語(yǔ)句中

def matchTryCatch: Unit = {
    try {
      throw new NullPointerException
    } catch {
      case e: NullPointerException => println("NullPointerException")
      case e: IndexOutOfBoundsException => print("IndexOutOfBoundsException")
    } finally {
      println("finally")
    }
}

Kotlin 篇

when 語(yǔ)句

Kotlin 也沒(méi)有 switch 語(yǔ)句,但是有功能近似的 when 語(yǔ)句,并且使用 when 語(yǔ)句也不需使用 break 語(yǔ)句。

例:

private fun test(foo: Any): String {
    var result = when (foo) {
        0 -> "Object equals"
        3, 10 -> "Or"
        in 11..20 -> "Range contains"
        is Date -> "Class instance"
        !in 4..30 -> "Range not contain"
        else -> "Default"
    }
    return result
}

assert("Object equals" == test(0))
assert("Or" == test(3))
assert("Range contains" == test(11))
assert("Range not contain" == test(33))
assert("Class instance" == test(Date()))

除了以上示例,when 還可以用來(lái)替代 if-else 語(yǔ)句

val x = 10
val y = 20
when {
    x + y == 5 -> println("x + y = 5")
    x + y == 10 -> println("x + y = 10")
    else -> println("x + y != 5 or 10")
}

Summary

  • Java 和 Groovy 支持 switch 語(yǔ)句,但是 Groovy 功能更強(qiáng)大
  • Scala 支持的模式匹配功能最強(qiáng)大
  • Kotlin 支持 when 語(yǔ)句

文章源碼見(jiàn) https://github.com/SidneyXu/JGSK 倉(cāng)庫(kù)的 _20_switch_match 小節(jié)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容