Kotlin---控制流程

if-else表达式

if-else的控制流中,可以使用表达是来获取结果,也可以通过闭包来获取表达式结果

class TestKotlin {

    fun function() {
        var x: Int = 10
        var y: Int = 20;
        // z取x,y中的较大值
        var z = if (x > y) x else y
        // 打印日志后返回值
        var m = if (x > y) {
            println("x > y:$x")
            x
        } else {
            println("x < y:$y")
            y
        }
    }
}

When表达式

When表达式取代了Java和C中的switch。但是比switch的能力强很多,在控制流程中可以加入表达式来辅助判断分支逻辑

class TestKotlin {

    fun function(input: Int) {
        when (input) {
            // 会优先执行表达式,然后再将输入匹配表达式结果,满足则执行该分支
            processInput(input) -> Log.e("Kotlin", "input x % 3:${processInput(input)} ")
            // in 关键字可以用来判断是否在某段区间,此处表示在1-2的区间内则走该分支
            in 1..2 -> Log.e("Kotlin", "input in 1-2:$input")
            // 除了表达式之外,还可以使用闭包
            in 4..6 -> {
                Log.e("Kotlin", "input in 4-6:$input")
            }
            // 最后需要有else,相当于default
            else -> {
                Log.e("Kotlin", "input else :$input")
            }
        }
    }

    fun processInput(x: Int): Int {
        // 此处如果能被3整除,则返回输入,否则返回0
        return if (x % 3 == 0) x else 0
    }
}

与Java和C不同的是,在when的控制流程中,不可以使用continue以及break,这两个关键字只能在Loop中使用。但是在函数中,return也还是可以随便使用的。

for循环

对于Map的遍历有两种方式

class TestKotlin {
    fun function() {
        val map: Map<A, B> = mapOf(A(1) to B(1), A(2) to B(2), A(3) to B(3))
        // 通过Key-Value的方式遍历Map
        for ((k, v) in map) {
            Log.e("Kotlin", "Key :${k.x}....Value:${v.x}")
        }
        // 通过Item的方式遍历Map
        for (item in map) {
            Log.e("Kotlin", "item Key:${item.key.x}....Value:${item.value.x}")
        }
    }

    class A(var x: Int)

    class B(var x: Int)
}

对于List的遍历方式,通过Iterator的方式可以获得Item,而通过IndexingIterable的方式,可以获得Index以及Item

class TestKotlin {

    fun function() {
        val list: List<A> = listOf(A(1), A(2), A(3), A(4))
        // Iterator
        for (item in list) {
            Log.e("Kotlin", "item :${item.x}")
        }
        // IndexingIterator
        for ((index, item) in list.withIndex()) {
            Log.e("Kotlin", "index:$index....Item:${item.x}")
        }
    }

    class A(var x: Int)
}

而for循环中,也可以使用continue以及``break```,简单的用法和Java、c的作用相同:

class TestKotlin {

    fun function() {
        val list: List<A> = listOf(A(1), A(2), A(3), A(4))
        for (item in list) {
            if (item.x == 2) {
                continue
            }
            if (item.x == 3) {
                break
            }
            Log.e("Kotlin", "Item:${item.x}")
        }

    }

    class A(var x: Int)
}

而Kotlin中,多重循环可以通过lable的形式与continue以及break配合进行多重循环内部的跳转:lable只能声明在循环前

  • continue+lable:跳转到该lable,并且继续下一次循环
  • break + lable:跳出该lable的循环,执行下一条指令

首先来看一下:在以下代码声明了loop@以及insideloop@两个标签声明在for循环前。而当循环遍历list的时候,如果遇到2时,则继续内部循环。而如果遇到3时,则跳出整个外部循环。

class TestKotlin {

    fun function() {
        val list: List<A> = listOf(A(1), A(2), A(3), A(4))
        loop@ for (i in list.size downTo 1) {
            insideloop@for (item in list) {
                if (item.x == 2) {
                    Log.e("Kotlin", "i:$i....Item:${item.x}: continue to insideloop")
                    continue@insideloop
                }
                if (item.x == 3) {
                    Log.e("Kotlin", "i:$i....Item:${item.x}: break to loop")
                    break@loop
                }
                Log.e("Kotlin", "i:$i....Item:${item.x}")
            }
        }

    }

    class A(var x: Int)
}

这段代码输出结果如下:

i:4....Item:1
i:4....Item:2: continue to insideloop
i:4....Item:3: break to loop

而如果如果改成break@insideloop的话,则会输出:

i:4....Item:1
i:4....Item:2: continue to insideloop
i:4....Item:3: break to loop
i:3....Item:1
i:3....Item:2: continue to insideloop
i:3....Item:3: break to loop
i:2....Item:1
i:2....Item:2: continue to insideloop
i:2....Item:3: break to loop
i:1....Item:1
i:1....Item:2: continue to insideloop
i:1....Item:3: break to loop

区间

之前使用过in关键字,来判断数字的区间以及是否在列表中。上面使用了downto关键字是用来反向输出的。例如:

class TestKotlin {

    fun function() {
        val list: List<A> = listOf(A(1), A(2), A(3), A(4))
        for (i in list.size downTo 1 step 2) {
            Log.e("Kotlin", "i:$i")
        }
    }
}

class A(var x: Int)

其中list.size downTo 1会输出4,3,2,1,而step 2则是会每次移动两个元素,所以输出的结果会是4,2

i:4
i:2

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏技术碎碎念

dom4j 使用总结

dom4j是一个Java的XML API,类似于jdom,用来读写XML文件 dom4j的使用方法简单总结来说如下: ①可以创建一个新的xml文件 ②利用SAX...

41380
来自专栏java系列博客

java生成与解析xml

17450
来自专栏chenjx85的技术专栏

leetcode-345-Reverse Vowels of a String

25870
来自专栏机器学习从入门到成神

字符串面试题(四)— 判断一个字符串是否为另外一个字符串旋转之后的字符串

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sinat_35512245/articl...

16810
来自专栏阮一峰的网络日志

字符串匹配的Boyer-Moore算法

上一篇文章,我介绍了KMP算法。 但是,它并不是效率最高的算法,实际采用并不多。各种文本编辑器的"查找"功能(Ctrl+F),大多采用Boyer-Moore算法...

29030
来自专栏技术小黑屋

为什么局部变量需要显式设置初始化值

我们在编程中,无时无刻地都在于方法打交道,而在方法中,我们很难不使用局部变量,比如我们有下面的这样一段很简单的代码

17640
来自专栏wOw的Android小站

[设计模式]之九:迭代器模式

迭代器分离了集合对象的遍历行为,抽象出一个迭代器负责。这既可以不暴露内部结构,也让外部代码透明地访问集合内部数据

5510
来自专栏指尖下的Android

二进制的运算

在计算机中存储字节是定长的,即我们8、16、32位等等,6的二进制位为110,但如果在8位计算机中是00000110,高位补零

26430
来自专栏desperate633

LeetCode 3. Longest Substring Without Repeating Characters题目分析

样例 例如,在"abcabcbb"中,其无重复字符的最长子字符串是"abc",其长度为 3。

7610
来自专栏ShaoYL

OC正则表达式的简单使用

376130

扫码关注云+社区

领取腾讯云代金券