从java到Kotlin之-控制流

2020-06-08  本文已影响0人  CZKGO

if...else

        在 Kotlin 中,if...else是一个表达式,即它会返回一个值。

// 作为表达式
val max = if (a > b) a else b

        if 的分支可以是代码块,最后的表达式作为该块的值:

val max = if (a > b) {
    print("Choose a")
    a
} else {
    print("Choose b")
    b
}

注意:

  1. if...else可以达到和三目运算符相同的效果,所以kotlin就不需要三目运算符
  2. if...else的返回值是可以忽略的,忽略后就和java的语句没什么差别
  3. 当使用 if 作为表达式而不是语句(例如:返回它的值或者把它赋给变量),该表达式需要有 else 分支。

(取消了三目运算符对不少人应该是好消息吧,带有返回值也是很棒的设计)

when

        在 Kotlin 中,when取代了类 Java的 switch-case语句。when语句的形式入下:

when (x) {
    //普通条件下,没有Java中的case和break语句
    1 -> print("x == 1") 
    //多个条件有相同的处理时,可以把多个条件放在一起,用逗号分隔
    2,3 -> print("x == 2 or x == 3")
    //可以用任意表达式和函数(而不只是常量)作为分支条件
    1+3 -> print("x == 4")
    add(1+4) -> print("x == 5")
    //可以检测一个值在(in)或者不在(!in)一个区间或者集合中
    in 6..10 -> print("x is in the 6~10")
    in validNumbers -> print("x is valid")
    !in 10..20 -> print("x is outside the range")
    //这里的else相当与Java的default语句
    else -> { 
        print("x is neither 1 nor 2")
    }
}

        和if...else类似,when也是一个表达式,具有返回值,满足条件的分支中最后的表达式就是其返回值

var result = when (x % 2) {
    0 -> {
        println("x是偶数")
        0
    }
    else -> {
        println("x是奇数")
        1
    }
}

        when还可以检测一个值是(is)或者不是(!is)一个特定类型的值。注意: 由于智能转换,你可以访问该类型的方法与属性而无需任何额外的检测。

fun hasPrefix(x: Any) = when(x) {
    is String -> x.startsWith("prefix")
    else -> false
}

        可以不提供参数,所有的分支条件都是简单的布尔表达式,而当一个分支的条件为真时则执行该分支,从而取代if-else if链

when {
    x.isOdd() -> print("x is odd")
    x.isEven() -> print("x is even")
    else -> print("x is funny")
}

        自 Kotlin 1.3 起,可以使用以下语法将 when 的主语(subject,译注:指 when 所判断的表达式)捕获到变量中:

fun Request.getBody() =
        when (val response = executeRequest()) {
            is Success -> response.body
            is HttpError -> throw HttpException(response.status)
        }

(总之666,这个when相比于java的简直太强大了有没有)

for

        for 循环可以对任何提供迭代器(iterator)的对象进行遍历,这相当于像 Java 中的 foreach 循环

Kotlin Java
for (item in collection) print(item) for (int item in collection) System.out.print(item)

        Kotlin中,在数字区间上迭代,请使用区间表达式替代java中的for(;;)语句:

for (i in 1..3) {
    println(i)
}
for (i in 6 downTo 0 step 2) {
    println(i)
}

        通过索引遍历一个数组或者一个 list,可以这么做:

for (i in array.indices) {
    println(array[i])
}
//可以用库函数 withIndex
for ((index, value) in array.withIndex()) {
    println("the element at $index is $value")
}

(这个for配合一些关健字可以实现一些花式遍历呢)

while和do...while

        while和do...while的用法和java一致
(不容易啊,终于看到一个和java用法一致的了)

上一篇下一篇

猜你喜欢

热点阅读