美文网首页
每天学一点 Kotlin -- 控制流:多元判断

每天学一点 Kotlin -- 控制流:多元判断

作者: 冯可乐同学 | 来源:发表于2021-10-21 10:47 被阅读0次

    ----《第一季Kotlin崛起:次世代Android开发 》学习笔记

    总目录:每天学一点 Kotlin ---- 目录
    上一篇:每天学一点 Kotlin -- 控制流:二元判断
    下一篇:每天学一点 Kotlin -- 控制流:循环

    1. 初次见面

    1.1 案例如下:

    fun main(args: Array<String>) {
        testWhen_01(10)
    }
    
    fun testWhen_01(a : Int){
        when(a){
            0 -> println("传入的参数是0")
            1 -> println("传入的参数是1")
            else -> println("传入的参数不是0也不是1")
        }
    }
    

    打印结果:

    传入的参数不是0也不是1
    

    1.2 在 C/Java 中,多元判断都是使用 switch 语句,而在 Kotlin 中使用的 when 关键字语句。

    2. 优化与扩展

    2.1 Kotlin 中的 when 语句是 Java 中 switch 语句的加强升级版,它可以对一个值进行细致化的判断,但是要求把所有情况列举完毕。 如上面代码所示。

    2.2 when 的 else 分支就跟 Java 中 switch 的 default 分支一样,但是区别是:如果编译器不能自动推断出 when 的所有情况,那么就必须要使用 else 来补充剩下的情况,如果编译器可以自动推断出 when 的所有情况,那么 else 分支可以省略,这样的写法是在遇到枚举和密封类的时候,因为它们的判断条件是有限的。这一点是和 Java 中 switch 的 default 不同,因为 default 是可以随意写或不写的(看代码逻辑而定,没有语法限制)。

    2.3 when 整体也能够作为表达式使用,所以每一个分支的结果就是返回值,示例代码如下:

    fun main(args: Array<String>) {
        println("result = " + testWhen_02(10))
    }
    
    fun testWhen_02(x: Int): Boolean {
        val isZero = when (x) {
            Int.MAX_VALUE -> true
            Int.MIN_VALUE -> true
            else -> false
        }
    
        return isZero
    }
    

    打印结果:

    result: false
    

    2.4 可以把返回同一结果的各种情况写在一个分支上,各个情况的表达式之间用逗号分隔:

    fun testWhen_03(x: Int): Boolean {
        val isZero = when (x) {
            Int.MAX_VALUE, Int.MIN_VALUE -> true
            else -> false
        }
    
        return isZero
    }
    

    2.5 还可以直接返回结果,省去中间变量的定义和赋值过程

    fun testWhen_04(x: Int): Boolean {
        return when (x) {
            Int.MAX_VALUE, Int.MIN_VALUE -> true
            else -> false
        }
    }
    

    2.6 借助于编译器强大的推断能力,几乎随处可见 Kotlin 中大量省去中间变量和返回类型以及 return 的代码。对于 when,不限于对常量每一种情况的判断,我们还可以对其加上函数,当函数被调用后的结果满足分支条件,这个分支就执行了:

    fun testWhen_05(x: Int): Boolean {
        return when (x) {
            Math.abs(x) -> true
            else -> false
        }
    }
    

    2.7 when 的分支条件中同样也支持区间,用关键字 in 来判断是否处于区间中:

    fun main(args: Array<String>) {
        println("是否是单个数字: " + testWhen_06(12))
    
    }
    fun testWhen_06(x: Int): Boolean{
        return when(x){
            in -9..9 -> true
            else -> false
        }
    }
    

    打印结果:

    是否是单个数字: false
    

    2.8 when 中还可以用智能类型转换,这样可以让编译器在运行时校验变量类型:

    fun main(args: Array<String>) {
        println("1--是否是字符串: " + testWhen_07(12))
        println("2--是否是字符串: " + testWhen_07("12"))
    }
    
    fun testWhen_07(any: Any): Boolean {
        return when (any) {
            is String -> true
            else -> false
        }
    }
    

    打印结果:

    1--是否是字符串: false
    2--是否是字符串: true
    

    上面函数的参数是 Any 类型,所有对其类型实际是无任何限制的,这样的类型只能在运行时检查。

    2.9 除了上面的几种情况之外,when 也可以不接受参数,这样分支语句就可以随便写了

    fun main(args: Array<String>) {
        testWhen_08(1, 2)
        testWhen_08(2, 1)
        testWhen_08(1, 1)
    }
    fun testWhen_08(a: Int, b: Int){
        when{
            a < b -> println("a < b")
            a > b -> println("a > b")
            else -> println("a = b")
        }
    }
    

    打印结果:

    a < b
    a > b
    a = b
    

    2.10 实际上,when 的分支根本不限制判断的组合次数,可以在 when 里面混合智能类型转换、in 语句、函数、常量等。

    fun testWhen_0(a: Any) {
        when (a) {
            in 1..7 -> {
                println("传入的值在1到7之间")
            }
    
            10, 11, 12 -> {
                println("传入的值是 10, 11, 12的其中之一")
            }
    
            (20 / 3) -> {
                println("传入的值和  20/3 的结果相等")
            }
    
            is Int -> {
                println("传入的是 Int 值")
            }
    
            else -> println("传入的参数是 String")
        }
    }
    
    相关代码:https://gitee.com/fzq.com/test-demo

    相关文章

      网友评论

          本文标题:每天学一点 Kotlin -- 控制流:多元判断

          本文链接:https://www.haomeiwen.com/subject/idkuoltx.html