美文网首页
【KtAndroid - 4】新颖的流程控制

【KtAndroid - 4】新颖的流程控制

作者: 会飞的小魚 | 来源:发表于2020-04-26 20:48 被阅读0次

    0. 序篇

    接上篇的留的小问题。

    companion object {
            val TEST_FIELD_1 = "我是Kotlin中的成员常量1"
            const val TEST_FIELD_2 = "我是Kotlin中的成员常量2"
    }
    

    关于以上两种定义常量的方式在转化成Java代码后是:

    1.png

    调用:

    2.png

    如果是下图:

    3.png

    报错!

    4.png

    综上结论:

    • const修饰的常量是直接常量,何为直接常量?(直接能通过类名.常量名)的常量。按照上图所说也就是publc static final ...。而上图所说TEST_FIELD_1则是间接常量,需要通过对象.getTEST_FIELD_1
    • const只能修饰类级别的常量字段,何为类级别(就是成员常量,非方法常量也就是我们经常所说的局部常量)

    1. Kotlin中新颖的流程控制

    流程控制我的都知道:顺序、循环、分支。在cc++java等编程语言中,这些流程控制几乎都是一样的。

    然而Kotlin为我们的流程控制提供了许多新特性,让我们一起来看看。

    一. if (条件)分支

    传统用法如下:

    public class JavaFile {
        public static void main(String[] args) {
            int m = 3;
    
            //if ...
            if (m == 1) System.out.println("m = 1");
    
            //if ... else ...
            if (m == 2) {
                System.out.println("m = 1");
            } else {
                System.out.println("m != 1");
            }
    
            //三目运算
            int b = m == 1 ? m : 3;
        }
    }
    

    Kotlin中的新用法:

    fun main() {
        var a: Int = 3
        var b: Int = 4
    
        var d = if (a > b) a else b
    
        var e: Int = if (a > b) {
            var a1 = a + 10
            a1
        } else {
            var b1 = b + 10
            b1
        }
        println("a=${a}")
        println("b=${b}")
        println("d=${d}")
        println("e=${e}")
    }
    

    运行结果:

    5.png

    **注意:kotlin中并不支持 三目运算 **

    如果需要类似操作

    var d = if (a > b) a else b
    

    二. if 区间

    在kotlin中if的新用法不仅仅是那么简单,同时它也支持区间判断

    在之前的文章 【KtAndroid -2 】基础语法 中我已经提到过for循环区间的使用。接下来我们来看看if区间是如何使用的

    //if区间的用法
    fun main() {
        var a = 10
    
        if (a in 1 .. 10) {
            println("a如果等于1~10中的任意一个数,将打印该语句。")
        }
    
        if (a in 1 until 10){
            println("a如果等于1~10且不包含10(即:1~9)中的任意一个数,将打印该语句。")
        }
    
        if(a in 1 until 10 step 2){
            println("a按照步进区间判断如果等于1、3、5、7、9中的任意一个数,将打印该语句。")
        }
    }
    

    运行结果:

    6.png
    //if区间的用法
    fun main() {
        var a = 9
    
        if (a in 1 .. 10) {
            println("a如果等于1~10中的任意一个数,将打印该语句。")
        }
    
        if (a in 1 until 10){
            println("a如果等于1~10且不包含10(即:1~9)中的任意一个数,将打印该语句。")
        }
    
        if(a in 1 until 10 step 2){
            println("a按照步进区间判断如果等于1、3、5、7、9中的任意一个数,将打印该语句。")
        }
    }
    

    运行结果:

    7.png

    2. when表达式

    when表达式类似于java中的switch

    fun main() {
        var x: Int = 5
        when (x) {
            1 -> println("x == 1")
            2 -> println("x == 2")
            3 -> println("x == 3")
            4 -> println("x == 4")
            5 -> println("x == 5")
            else -> println("x == 其他值")
        }
    }
    

    运行结果:

    当然,还有多值语句:

    fun main() {
        var x: Int = 5
        
        when (x) {
            1, 2, 3, 4 -> println("x等于1,2,3,4中的任意一个")
            else -> {
                println("x任何一个值都不等于")
                println("我是块语句,我可以打印多条语句!")
            }
        }
    }
    

    结果:

    9.png

    关于->的说明,->是lambda表达式,你暂且可以将它当做一个匿名函数,由于不好表述,我就用以下代码作为解释。

    ///例如java中的
    public static void main(String[] args) {
        int x = 5;
        switch (x) {
            case 1:
            case 2:
            case 3:
            case 4:
                func(x);
            default: {
                System.out.println("x任何一个值都不等于");
                System.out.println("我是块语句,我可以打印多条语句!");
            }
        }
    }
    
    public static void func(int x) {
        System.out.println("x等于1,2,3,4中的任意一个");
    }
    

    when的用法还有很多:

    //集合判断
    fun main() {
        val items = setOf("apple", "banana", "kiwi")
        when {
            "orange" in items -> println("juicy")
            "apple" in items -> println("apple is fine too")
        }
    }
    
    //方法判断
    fun main() {
        println(func4(0))
    }
    
    fun func4(code: Int): String = when (code) {
        0 -> "登录成功!"
        -1 -> "登录失败!"
        else -> "未知错误!"
    }
    

    ...

    至于其他操作,如:区间is 等,就自己去试试吧。

    3. 循环(for、while、 do ... while)

    对于三大流程控制中的循环一块,比起条件控制,循环控制简直最常用的一块了。

    然鹅初次涉及编程的人大概也是最头疼这一块了,在寻常的循环控制当中,简单地迭代、遍历已经能满足程序的运作。但是kotlin却为我们提供了更加新颖的流程控制。

    一. for循环

    首先来看for循环

    java程序中:

    public static void main(String[] args) {
        for (int i = 0; i < 10; i++) {
            System.out.println(i);
        }
    }
    

    Kotlin中相同实现功能则是:

    fun main(args: Array<String>){
        for(i in 0 .. 9){
            println(i)
        }
    }
    

    java中迭代集合:

    public static void main(String[] args) {
        List<String> array = new ArrayList();
        array.add("one");
        array.add("two");
        array.add("three");
    
        for (String s : array) {
            System.out.println(s);
        }
    }
    

    kotlin中迭代集合:

    fun main(args: Array<String>){
        val arr:Array<String> = arrayOf("one","two","three")
        for (s in arr) {
            println(s)
        }
        
        //按遍历索引
        for (i:Int in arr.indices) {
            println("i=$i --- arr=${arr[i]}")
        }
        
        //键、值遍历
        for ((i: Int, v: Any) in arr.withIndex()) {
            println("i=$i ----- v=$v")
        }
    }
    

    二. while、do ... while 循环

    与java几乎无异了,

    while

    java代码:

    public static void main(String[] args) {
        int i = 0;
        while (i <= 10) {
            System.out.println(i++);
        }
    }
    

    kotlin代码:

    fun main(){
        var i: Int = 0;
        while (i in 0..9) {
            println(i++)
        }
    }
    

    do ... while

    java代码:

    public static void main(String[] args) {
        int m = 0;
        do {
            System.out.println(i++);
        } while (m <= 10);
    }
    

    kotlin代码:

    fun main(){
        int m = 0
        do {
            println(i++)
        } while (m in 0 until 11);
    }
    

    循环这一块多说无益,需要自己结合各种kotlin中的新特性来理解。

    4. 总结

    • kotlin中 if 有了更多、更新颖的用法,如:if(x > 1 .. 10)var m = if(x > 1 .. 10)...
    • kotlin中 多分支并不是传统的 switch 而是 when 表达式,在when 表达式else 等同于 switch 中的 default: 语句。
    • ifwhen 表达式,循环都支持区间
    • 在循环中以indices可遍历下标,withIndex()可遍历键值

    相关文章

      网友评论

          本文标题:【KtAndroid - 4】新颖的流程控制

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