Kotlin:05-控制流 if、when、for、while

2020-08-11 11:32:39 浏览数 (1)

一、if 表达式

在 Kotlin 中,if 既可以作为普通的判断语句使用,也可以作为表达式使用。 当 if 作为表达式使用时,本身就会有返回值,其效果等同于 java 中的三元运算。

我们来看使用 if 语句 获取两个值中较大值的代码,如果按照 java 中的模式,我们应该这么写:

代码语言:javascript复制
fun getMaxVal1(a: Int, b: Int) {
   var max: Int
   if (a > b) {
       max = a
   } else {
       max = b
   }
}

但是,我们已经知道了,在 kotlin 中,if 作为表达式时有返回值,效果等同于 java 中的三元运算,所以,我们获取两个值中较大值的代码就可以这么写:

代码语言:javascript复制
fun getMaxVal2(a: Int, b: Int) {
   var max = if (a > b) a else b    //这种方式等同于 java 中的 三元运算
}

这样是不是感觉很清新?

注意:

  • 作为表达式使用时,其性质等同于 java 中的三元运算,必须要有 else 字段

另外,作为表达式使用时,if 和 else 分支后面不仅能跟普通的值,也可以跟代码块。如:

代码语言:javascript复制
 val max = if (a > b) {    //作为表达式使用时,我们跟了一段代码块,
       print("Choose a")
       a
   } else {
       print("Choose b")
       b
   }

向上面的这段代码中,我们将 if 作为表达式使用,并且在 if 和 else 分支后面跟了一段代码块,这样,我们不但能将 较大的值赋值给 max , 还能在同时做其他的操作 -- 这里是打印了一句话。

二、When 表达式

(一)、主要特点:

kotlin 中 ,When 的主要特点如下:

  • When 类似于 java 中的 switch ,但是功能比 switch 更为强大。
  • When 既可以当做表达式使用,也可以当做语句使用。
    • 当做语句使用时,效果等同于 java 中的 switch
    • 当做表达式使用时,会有返回值,符合条件的分支的值就是整个表达式的值。
    • **将 when 当做表达式使用时, 必须要有 else 分支,
    • when 的各个分支不仅可以是常量,也可以是表达式**。
  • 如果多个分支有相同的处理方式,则可以把多个分支条件放在一起,用逗号分隔。这种方式类似于 java 中 switch 语句的穿透

(二)、用法示例

好了,我们已经知道了 when 的主要特点,那么接下来就看下 when 的具体用法:

示例1、when 的基本使用格式
代码语言:javascript复制
fun main(arg: Array<String>) {
   whenFunc1(6)
}fun whenFunc1(a: Int) {    //基本使用格式示例
   when (a) {
       1 -> println("传入的值是1")
       2 -> println("传入的值是2")
       else -> {
           println("传入的值既不是1 也不是2")
       }
   }
}
示例2、多分支共用一种处理(分支穿透)
代码语言:javascript复制
fun whenFunc2(a: Int) {
   when (a) {
       1, 2 -> println("传入的是1 或者是2")   //分支穿透
       else -> {
           println("传入的既不是1 也不是2")
       }
   }
}
示例3、以表达式(而不只是常量)作为分支条件
代码语言:javascript复制
fun whenFunc3(a: Int) {
   when (a) {
       sum(3, 3) -> print("a 的值是 ${sum(3, 3)}")    //以表达式作为分支,实际是以表达式的值作为分支条件
       else -> print("我哪里知道分支值是多少")
   }
}

在上面的代码中,我们 使用 Integer.sum(a,b) 方法作为 when 的分支条件,实际就是以 sum 的值作为分支条件。

示例4、将When 作为 if..else if 使用
A : 检测某个值是否在区间或者集合中
  • 判断某个值是否在 XXX 中的关键字 是 in
  • 判断某个值是否在 XXX 中的关键字 是 !in
  • 区间 就是指一个数据范围,在高中数学中有相应介绍。
    • 区间分为开区间 、闭区间 、半开区间 。
    • 开区间的表示方式为 ( a , b ) , 表示该范围内的数据 自 a 开始 到 b 结束,但不包含 a 和 b
    • 闭区间的表示方式为 [ a , b ] , 表示该范围内的数据 自 a 开始到 b 结束,包含 a 和 b
    • 半开区间有两种方式:( a , b ] 和 [ a ,b ) 。前者表示不包含 a 但是 包含 b , 后者表示 包含 a 但不包含 b
代码语言:javascript复制
fun whenFunc4(a: Int) {
   when (a) {
       in 1..5 -> println("$a 在 1..5 的区间之内")
       !in 10..15 -> println("$a 不在 10..15 的区间之内")
       else -> println("$a 在 10..15 的区间之内")
   }
}

上面的代码中,我们演示了判断一个值是否在区间之内,当然也可以判断值是否在某个集合中,关于集合的内容后面会有讲解。

B : 检测某个值是否是某种类型
  • 检测某个值是某种类型的关键字是 is
  • 检测某个值不是某种类型的关键字是 “!is”
代码语言:javascript复制
fun whenFunc5(a: Int?) {
   when (a) {
       is Int -> println("$a 是 Int 类型的数据")
       else -> println("$a 不是 Int 类型的数据")
   }
}
C :when 后面也可以不跟参数

如果不提供参数,所有的分支条件都是简单的布尔表达式,而当一个分支的条件为真时则执行该分支:

代码语言:javascript复制
fun whenFunc6(a: Int) {
   when {  //此处未跟参数,所以分支条件必须是 简单的 boolean 表达式
       a < 6 -> println("$a 小于6")
       a == 6 -> println("传入的值是6")
       else -> println("$a 大于6")
   }
}

三、 For 循环

(一)、for 循环的特点

Kotlin 中的 for 循环可以对任何提供迭代器(iterator)的对象进行遍历,等同于 java 中的 foreach 循环。

for 可以循环遍历任何提供了迭代器的对象。也就是说:

  • 该对象中必须有一个 iterator( ) 函数,可以是它自己声明的也可以是继承自父类的。
  • iterator( ) 必须有返回值。假设该返回值的对象类为A
  • 对象类 A 中 必须有 next( ) 函数,可以是它自己声明的也可以是继承自父类的
  • 对象类 A 中 还必须有 hasNext( ) 函数,该函数的返回值 为 Boolean类型
  • 而且以上这三个函数都需要标记为 operator 。也就是说这三个方式需要是公共的,可以被其他类访问的。

(二)、for 循环的基本语法

for 循环的基本语法如下:

代码语言:javascript复制
for (item in collection)
   print(item)

循环体可以是一个代码块:

代码语言:javascript复制
for (item: Int in ints) {
      // ......代码块......
}
示例1:遍历获取数组中的数据
代码语言:javascript复制
fun forFunc1() {
   var nums = arrayOf(1, 2, 3, 4, 5, 6, 7)  //创建数组
   for (num in nums) { //遍历并打印数据
       println(num)
   }
}
示例2:遍历数组中的索引
代码语言:javascript复制
fun forFunc2() {
   var nums = arrayOf(1, 2, 3, 4, 5)
   for (index in nums.indices) {   //遍历数组的索引
       println(nums[index])    //打印根据索引获得的数据
   }
}

遍历索引时,需要使用 Array.indices( ) 函数 ,该函数返回的是 数组的索引区间。indices( ) 源码如下:

代码语言:javascript复制
/**
* Returns the range of valid indices for the array.
*/
public val <T> Array<out T>.indices: IntRange
   get() = IntRange(0, lastIndex)

所以,遍历索引的本质就是区间的遍历。

示例3、同时遍历数据和索引
代码语言:javascript复制
fun forFunc3() {
   var nums = arrayOf(1, 2, 3, 4, 5)
   for ((num, index) in nums.withIndex()) {
       println("索引 $index 对应的数据是 $num")
   }
}

同时遍历数据和索引时,需要使用 Array.withIndex( ) 函数。

(三)、补充:forEach

kotlin中遍历的时候,我们也可以使用 forEach ( ){ }, 需要注意的是:

使用 forEach 函数时, 被遍历到的数据 使用固定的字符 it 表示。

示例代码如下:

代码语言:javascript复制
fun forFunc4() {
   var nums = arrayOf(1, 2, 3, 4, 5)
   nums.forEach {    //forEach 遍历到的数据使用固定的 it 代表
       println("nums 中的数据包含 $it")
   }
}

在上面的代码中,我们使用 forEach 遍历了数组中的数据,在println("nums 中的数据包含 $it") 中,it 就代码每次遍历到的具体数据。

四、While 循环

Kotlin 中的 while 和 do...while 与java中的并没有区别,使用的方式是一致的。所以,不在赘述 ,可参考下面示例代码:

示例1:

代码语言:javascript复制
fun whileFunc1() {
   var a = 10
   while (a > 0) {
       println("当前a 的值是 $a")
       a--
   }
}

示例2:

代码语言:javascript复制
fun whileFunc2() {
   var a = 10
   do {
       println("当前 a 的值是 $a")
       a--
   } while (a > 0)
}

本文到此结束,谢谢观看!

0 人点赞