Kotlin(3)控制逻辑

Kotlin(三)控制逻辑语句

一.条件分支

1.if...else...

kotlin中if-else的用法和java没什么区别,这里就不再贴代码了。值得一说的是,kotlin中用if-else取代了java的三元运算:

var str = if (istrue == true) "真" else "假"//if-else自带返回值

2.多路分支

kotlin中将java的多路分支switch/case模式替换为了when/else模式,而且默认执行完一条分支语句后自动跳出循环,不再需要break

var count:Int = 0
btn_hello.setOnClickListener { 
      when (count) {
          0 -> btn_hello.text = "按钮0"
          1 -> btn_hello.text = "按钮1"
          else -> btn_hello.text = "按钮else"//else不可被省略
      }
      count++
}

和Java的多路分支一对比可以看出:

  • 关键字switch被when取代,default被else取代
  • "case 常量值:"被"常量值 ->"取代

而且kotlin的when/else模式和if-else一样允许自带返回值,上面的代码可以修改为:

var count:Int = 0
btn_hello.setOnClickListener { 
     btn_hello.text = when (count) {
         0 -> "按钮0"
         1 -> "按钮1"
         else -> "按钮else"//else不可被省略
     }
     count++
}

另外,java中case后面只能是一个常量,但在这里可以用变量了:

var count:Int = 0
var x:Int = 1
btn_hello.setOnClickListener { 
     btn_hello.text = when (count) {
          0 -> "按钮0"
          x -> "按钮1"
          else -> "按钮else"//else不可被省略
     }
     count++
}

下面说一个kotlin多路分支语句比较牛逼的扩展,就是它可以分块判断,或者说是一种同类判断,还是贴代码吧:

var count:Int = 0
btn_hello.setOnClickListener { 
    btn_hello.text = when (count) {
         0, 1, 3, 5 -> "按钮0"
         2, 4, 6, 8 -> "按钮1"
         in 10..15 -> "按钮10"
         !in 17..20 -> "按钮20"
         else -> "按钮else"//else不可被省略
    }
    count++
}

如果常量值刚好是连续的几个整数,就可以用"in 开始值..结束值"的形式,同样的!in的意义也就不用多说了吧,也就是不在该区间时执行。可能你会问整数1满足了第一个判断又满足了第四个判断可咋整,当1满足了第一个判断并执行完后,会自动跳出循环,它是不会再走到第四个判断的

3.类型判断

java中的类型判断用的是instanceof关键字,kotlin中则用is代替了它,if判断中的写法:

if(str is String) {...}

如果用在多路分支语句中的话:

var count:Number = 1f
btn_hello.setOnClickListener { 
     btn_hello.text = when (count) {
          is Int -> "按钮0"
          is Float -> "按钮1"
          else -> "按钮else"//else不可被省略
     }
}

二.循环遍历

1.遍历

java中我们最常用的遍历方式就是for循环,一般我们用到的有“for(初始化;条件;增减)”和增强for循环“for(int i : array_int)”,其中对于增强for在上一篇说容器集合的遍历时就已经用到过,它变成了“for(i in array_int)”的形式,用关键字in替代了:。对于前面那种三元for循环已经被kotlin废除了,它被for(i in 数组对象.indices)的形式所代替,indices是数组对象的下标数组

2.条件循环

kotlin废除了三元for循环肯定要从另一角度去实现三元for循环所具有的功能,仅仅用for(i in 数组对象.indices)来替代它可能还远远不够,比如说递增值不是1、方向不是递增而是递减等等,kotlin最初提供了一些关键字来解决这些问题:

for(i in 11 until 18){...}//左闭右开,不包括18
for(i in 11..28 step 2){...}//以2递增
for(i in 18 downTo 10){...}//递减

后来,这些个关键字在使用上也不是特别灵活,kotlin推荐使用while语句来实现三元for循环的效果

var str:String = ""
var i:Int = 0
while(i < array_int.size) {
    if (i % 2 == 0) {
        str = "$str${strarray_int.get(i)}"
    }
    i++
}
或者
do{
    if (i % 2 == 0) {
        str = "$str${strarray_int.get(i)}"
    }
    i++
}while(i < array_int.size)

其实兜兜转转我也没搞明白kotlin为什么要废除三元for循环,感觉在使用上并没有所谓的逻辑繁琐不清晰,到头来kotlin也没有提供它的替代者,那几个关键字在使用上并没有更加灵活,后面则推荐用while循环来变相实现,这一顿操作我是没看明白。

3.跳出多重循环

当数组中存在空指针、空串时需要根据判断来跳出循环,往往我们的循环会嵌套很多层,如果要跳出所有的循环java语言的写法就是一层一层的进行判断再执行break,kotlin最初提供了continue和break关键字,可以直接跳出所有循环:

val array_str:Array<String?> = arrayOf("123", "23", "231", null, "456")
var pos:Int = 0
var str:String = ""
while (pos < array_str.size) {
      if (array_str[pos].isNullOrBlank()) {
           continue//若发现为null或空串则忽略当前循环执行下一循环
      }
      str = "$str${array_str[pos]}"
      pos++
      if (pos > 4) {
           break//结束所有循环
      }
}

然后kotlin又提供了另外一种更加灵活的方式,用“break@+跳转标记名”的方式指定跳出的位置,这个标记名可以随意命名:

val array_str:Array<String?> = arrayOf("123", "23", "231", null, "456")
var pos:Int = 0
var str:String = ""
out@ while (pos < array_str.size) {
     if (array_str[pos].isNullOrBlank()) {
         continue//若发现为null或空串则忽略当前循环执行下一循环
     }
     str = "$str${array_str[pos]}"
     pos++
     if (pos > 4) {
         break@out//结束所有循环
     }
}

三.空安全

在上面说跳出循环中定义String类型数组时,String类型后跟了一个?,这个问号就是kotlin处理空指针异常的方式。那句初始化字符串数组的代码中含有null元素,且并没有报错就是因为?允许了数组元素中存在null,如果把这个问号去掉编译是不会通过的。

String作为特殊的一个数据对象,kotlin在很多方便都有特别的照顾,它提供了一堆方法来判断String对象的有效性:

  • isNullOrEmpty 为空指针或字符长度为0时返回true,非空串和可空串均可调用
  • isNullOrBlank 为空指针、字符长度为0或字符全为空格时返回true,非空串和可空串均可调用
  • isEmpty 字符长度为0时返回true,只有非空串可调用
  • isBlank 字符长度为0或全为空格时返回true,只有非空串可调用
  • isNotEmpty 字符长度>0时返回true,只有非空串可调用
  • isNotBlank 字符长度>0或不全为空格时返回true,只有非空串可调用

这上面提到了一个“可空串”的概念,啥玩意叫可空串,就是可以为null的字符串,非空串就是不能为null的字符串,如果为null则编译不通过。俩兄弟的变量声明方式如下:

var str1:String = "不能为空"
var str2:String? = "可以为空"

其余的数据类型都有"可空"和"非空"的概念:
var num1:Int = 1
var num2:Int? = null
var list1:Array<Float>? = null

说完“?”,再来说说“?.”、“?:”、“!!”三兄弟

(1)?.就是用来判断变量是否为空,为空的话直接返回null

var str:String? = null
var l:Int? = str?.length

//因为变量为空的话它所有属性的值也一定为null,这里的第二行代码就等同于:
var l:Int? = if(str!=null) str.length else null

但是它在为空的情况下会返回null,往往我们在空指针判断时都习惯用另外的一个值来标识null,比如-1、"该值不存在"等等,这个时候就需要用到“?:”

(2)?:又叫Elvis操作符,它也类似于java的三元运算符

var str:String? = null
var l:Int? = str?.length?:-1
var s:String? = str?.length?:"这玩意是个空串"

当"?:"左边表达式的值为null时就返回右边的值,不为空就返回左边表达式自身的值

(3)!!用来强行将变量确定为非空变量

如果对某个变量已经百分之百确定是非空的了,而它在初始化时是可空类型,那么就可以用!!来强行将该变量转为非空变量,即可以避免没有必要的非空判断。如果强转之后变量又被赋值为null,那么运行时就会抛出空指针异常

var str:String? = "12123213"
var l:Int = str!!.length

更详细的的理解大家可以参考https://www.jianshu.com/p/51b2e5aa3dd8

四.等式判断

java中对于字符串内容的判断用的是equals方法,int、float等一些基本数据类型直接用"=="来判断。kotlin中消除了他俩的不一致,全部统一为"=="来判断变量的内容是否一致。然后是关于引用相等的判断,就是不仅仅要判断内容,还要判断对象的存储地址,kotlin中统一用"==="来判断

下一遍来说方法的使用https://blog.csdn.net/qq_37159335/article/details/90896100

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我们间的空白格

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值