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

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()可遍历键值
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,905评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,140评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,791评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,483评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,476评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,516评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,905评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,560评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,778评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,557评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,635评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,338评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,925评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,898评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,142评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,818评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,347评论 2 342

推荐阅读更多精彩内容