Android开发,Kotlin的了解与学习(三)-----流程控制语句

这一章主要讲一讲Kotlin中 for if while等的使用方法

If

Kotlin中 if和java中的if比较相似,至少从代码上来看,是没有太大的区别的

var a: Int = 1
if (a > 0){
   a = 0
}
但是有一点需要注意假如是下面这种

var a: Int = 1
var b: Int? = 2
if (a > b){
    a = b
}
这样是不行的,因为这里的b是可以为空的,不能直接和a进行比较

这就是kotlin的空指针安全了

那要怎么弄了?

如下

if (a > b!!){
    a = b!!
}
这里的双感叹号可以理解为我知道这个不会为空所以请继续走,也可以理解为,我不在乎现在是不是空指针,所以如果不是就直接走一下步,如果是空指针就直接抛异常就是了

上面呢就是和java相似的用法了

下面是不同的

if在kotlin中不仅仅可以用作条件语句,还可以返回一个值

如下

var max = if (a > b) {
            a
        } else {
            b
        }

就是说,如果a>b就返回一个a给max,反之则返回一个b给max

需要注意的是,作为一个返回值的时候,返回值必须放到最后一行

而采用这种方式的if必须带有else,否则会报错。
看了这个,我只能双击666了。

原始java如下

int max;
if(a > b){
    max = a
}else{
    max = b
}
平等来看,其实代码量虽然有增加,但是并没有差距太多。但是贵在简洁,贵在if的多用性,在这种小代码上还看不出来,但是到了复杂的地方就可以很明显了。

不过它的劣势也有,就是默认值的劣势,如下

java:
int max = b;
if(a > b){
      max = a;
}
kotlin就不能这样了,max是没有默认值的,必须要通过if和else来进行赋值

这劣势有点生搬硬凑哈。。。

for

for循环相对于java就有很大的变化了,先来看看最简单的for循环

	for (num in 0..5) {
            array3.add(num)
        }
可以看到和java十分的不一样了,首先,没有类似于java分为三段表达

for(int i = 0; i<5; i++){
}

反而有点类似于foreach的用法

这里的 num in 0..5,就代表了定义了一个参数 num,它的的范围是介于0到5之间(两端都是闭包,即同时包括了0.1.2.3.4.5六个数)

每次都进行i++这样的操作

另外这里的范围不仅仅可以用0..5这样,还可以像这样

	var nums = arrayOf(2, 4, 6)
        for (num in nums) {
            println("num" + num)
        }

另外,不仅仅是数字,还可以这样

	var nums = arrayOf("num1", "num2", "num3")
        for (num in nums) {
            println("num" + num)
        }

再再另外,不仅仅是简单参数,还是可以实体类,不过这个比较好理解了,因为foreach就是实体类

最后,还可以像下面这样

        for (arr in array) {
            println(arr)
        }
        for (arr in array.indices) {
            println(array[arr])
        }

这里是两个for循环,array是一个任意集合或者数组

上面的循环,就是类似于foreach的循环,arr是对应的元素

下面的循环中,用到了array.indices这个方法,这个获取的是array的序列号集合

比如array是一个size为5的数组,通过indices得到的就是(0.1.2.3.4)这样的集合

得到的arr就是一个数组下标

类似于

for(arr in 0..4){

}

更多的用法我暂时没有更深入的研究,在后面的使用中可以继续添加。


最后,上面提到了foreach,kotlin中没有java中的那种foreach函数,但是!

kotlin中是存在foreach的

只是使用方法和java中不一样,如下:

        var array1 = arrayOf(1, 2, 3)
        array1.forEach {
            println(it)
        }
需要注意的是里面的it,这个参数,这不是我们自己命名的参数,而是在使用foreach时,循环得到的元素,并且这个it是根据你循环体的类型自动判断类型,如果你循环的是实体类集合,他给你的就是单个的实体类,是不是很无敌,另外forEach比较特殊,本文后面讲标签的时候会讲到


when

这里的when呢,java里面是没有的,只有一个while,但c里面有,其实这个when就是java里面的switch

用法如下

        var w = 3
        when(w){
            0-> println("000")
            1,2-> println("111222")
            3-> println("333")
            else -> println("444")
        }

其实就是一个switch case的路数

不过相比于switch case又多了很多的用法

比如,这里的w不仅仅可以是int,还可以是其他的类型(java里面 jdk1.7以后才可以switch 用String类型)

	var w = "a2"
        when(w){
            "a1"-> println("000")
            "a2"-> println("111222")
            "a3"-> println("333")
            else -> println("444")
        }

另外这里的分支语句,不仅仅可以用写死的值,还可以用表达式代替

比如

	var n = "num:2"
        var c = 2
        when(n){
            getNum(c)-> println("yes")
            else -> println("no")
        }
    fun getNum(num:Int) : String{
        return "num:$num"
    }

下面的语句是一个方法,传入int类型,返回string类型的一个方法,这个后面会提到

主要看上面,我们的case语句不是一个写死的值,而是一个经过计算的量
另外,重点来了

和if一样,when也可以作为一个带返回值的表达式使用

如下

       var w = "a2"
       var isTrue = when(w){
            "a1"->false
            "a2"->true
            else->false
        }

这个操作就比较厉害了

需要注意的是,如果在进行返回的时候还需要做其他操作,和if一样,返回值需要放在方法的最后一行

        var isTrue = when (w) {
            "a1" -> {
                println(false)
                false
            }
            "a2" -> {
                println(true)
                true
            }
            else -> false
        }
恩,多行操作需要加一个括号,这个不需要专门说了吧


while

while呢,和java的倒是比较相似

        var c = 2
        while (c > 0){
            c--
        }

还有就是do while的用法

        var dow = 0;
        do {
            dow++
        } while (dow < 9)
和java类似,就不过多的描述了

另外还有三个跳出语句

break、continue、return

基础用法就仔细写了,如下

        for (a in 0..5){
            for (b in 3..7){
                if (a == b){
                    break
                }
            }
        }
        for (a in 0..5){
            for (b in 3..7){
                if (a == b){
                    continue
                }
            }
        }
        for (a in 0..5){
            for (b in 3..7){
                if (a == b){
                    return
                }
            }
        }
分别是跳出最近的循环、不继续执行后面的语句进入下一次循环、跳出所有循环

在kotlin中还有更深层次的运用--标签

如下

        for1@ for (a in 0..5) {
            for2@ for (b in 3..7) {
                if (a == b) {
                    continue@for1
                }
                println("for" + a)
            }
        }
在循环体前加标签名+@,代表给该层循环命名,在使用continue的时候,代表跳到该层循环继续下一次循环

如上,代表了当a = b时,结束内层循环,a++,进入下一次的循环,这个操作在使用多层(3层即以上)时,效果明显,在只有两层的时候,上面的代码相当于下面:

        for (a in 0..5) {
            for (b in 3..7) {
                if (a == b) {
                    break
                }
                println("for" + a)
            }
        }
break、retun使用标签的用法和continue类似

需要注意的是在使用return时,如果该方法是一个需要返回值的方法,即retun必须要返回一个值时,就不能使用标签

上面for中用到了forEach这个方法,我们还可以这样

        nums.forEach {
            for (i in 0..6) {
                if (i == 3){
                    return@forEach
                }
                println(it+":"+i)
            }
        }
这里的forEach直接就可以作为一个标签来使用

但是需要注意的是,这里只能用return,用break或者continue是不行的
会提示:the label @forEach does not denote a loop

这个标签不能作为一个回路

其实很好理解,break 或者continue都是跳出循环体使用的,但是这里的forEach不能简单视作一个循环体,所以不能使用break或者continue来跳到下一个循环,另外像下面这样使用也是不行的

        loop@ for (i in 0..6) {
            nums.forEach {
                if (i == 3) {
                    break@loop
                }
                println(it + ":" + i)
            }
        }
会提示‘break‘ or ‘continue’ jumps across a function or a class bounary
break或者continue跨越了方法或者类的边界

不怎么好理解,但是大致理解下就是,在forEach循环内部是不允许使用break或者continue来跳到更外层循环的

事实上,不仅仅是采用标签跳出,甚至连基本跳出都是不允许的

        for (i in 0..6) {
            nums.forEach {
                if (i == 3) {
                    break
                }
                println(it + ":" + i)
            }
        }
forEach是比较特殊的,这一点需要注意

以上就是kotlin中关于循环控制语句的学习与理解,不难看出,kotlin中的循环语句相对于java方便了很多,但是难能可贵的是,在理解成本上投入却很低,很容易就能学习并掌握住了


Android开发,Kotlin的了解与学习(四)-----基本语法的使用







  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值