zoukankan      html  css  js  c++  java
  • Java & Groovy & Scala & Kotlin

    Overview

    本章主要介绍高级条件语句中的 switch 语句以及其增强版的模式匹配。

    Java 篇

    Switch

    特点

    • Java 中 switch 语句功能类似 if,但是 switch 主要用在多条件分支上。
    • switch 语句由 case 分支和 default 组成,case 分支用于检查条件,且参数必须为常量,default 用于执行当任何 case 分支都不匹配时执行的语句。
    • switch 语句 在 Java 1.7 以前只支持基本类型,Java 1.7 开始支持 String
    • 执行时 switch 语句会从上而下检查与 case 条件是否一致,一旦发现相等的分支,switch 语句就会执行该条 case 分支下的语句,并且之后会忽略下面的所有 case 分支,直到遇到 break才会停止执行。

    例:

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

    以上语句的输出结果为

    i is 10
    i is 100
    i is 1000
    

    Groovy 篇

    Switch

    Groovy 的 switch 语句类似 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)
    

    以上语句的输出结果为

    i is 10
    i is 100
    i is 1000
    

    Scala 篇

    模式匹配

    Scala 没有 switch 语句,但是有类似功能的模式匹配。模式匹配的语法在外观上有些像 Java 的 switch 语句,但是没有 break 语句,在功能上则比 Java 的 switch 语句要强大很多。

    例:

    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语句中

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

    Kotlin 篇

    when 语句

    Kotlin 也没有 switch 语句,但是有功能近似的 when 语句,并且使用 when 语句也不需使用 break 语句。

    例:

    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 还可以用来替代 if-else语句

    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 语句,但是 Groovy 功能更强大
    • Scala 支持的模式匹配功能最强大
    • Kotlin 支持 when 语句

    文章源码见 https://github.com/SidneyXu/JGSK仓库的 _20_switch_match小节



    作者:bookislife
    链接:https://www.jianshu.com/p/e65d1dd4e911
    来源:简书
    简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
  • 相关阅读:
    linux会话浅析
    linux memory lock浅析
    浅谈动态库符号的私有化与全局化
    LINUX内核内存屏障
    linux内存屏障浅析
    linux内核mem_cgroup浅析
    记一个linux内核内存提权问题
    linux内核cfs浅析
    linux内核tmpfs/shmem浅析
    linux IPv4报文处理浅析
  • 原文地址:https://www.cnblogs.com/feng9exe/p/10458032.html
Copyright © 2011-2022 走看看