Условные операторы Kotlin

Выражение IF

Оператор if содержит логическое выражение и один или несколько операторов.

// 传统用法
var max = a 
if (a < b) max = b

// 使用 else 
var max: Int
if (a > b) {
    max = a
} else {
    max = b
}
 
// 作为表达式
val max = if (a > b) a else b

Мы также можем присвоить результат выражения IF переменной.

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

Это также показывает, что нам не нужен тернарный оператор, как в Java, потому что мы можем просто реализовать его с его помощью:

val c = if (condition) a else b

Примеры

fun main(args: Array<String>) {
    var x = 0
    if(x>0){
        println("x 大于 0")
    }else if(x==0){
        println("x 等于 0")
    }else{
        println("x 小于 0")
    }

    var a = 1
    var b = 2
    val c = if (a>=b) a else b
    println("c 的值为 $c")
}

Вывод:

x 等于 0
c 的值为 2

Использование диапазонов

Используйте оператор in, чтобы проверить, находится ли число в указанном диапазоне. Формат диапазона:x..y :

Примеры

fun main(args: Array<String>) {
    val x = 5
    val y = 9
    if (x in 1..8) {
        println("x 在区间内")
    }
}

Вывод:

x 在区间内

Выражение when

when сравнивает свой аргумент со всеми условиями ветвей по порядку, пока не найдётся ветвь, удовлетворяющая условию.

when можно использовать либо как выражение, либо как инструкцию. Если он используется как выражение, значение подходящей ветви является значением всего выражения. Если он используется как инструкция, значения отдельных ветвей игнорируются.

when похож на оператор switch в других языках. Его простейшая форма выглядит так:

when (x) {
    1 -> print("x == 1")
    2 -> print("x == 2")
    else -> { // 注意这个块
        print("x 不是 1 ,也不是 2")
    }
}

В when else — то же самое, что default в switch. Если ни одна из других ветвей не удовлетворяет условию, будет вычислена ветвь else.

Если многие ветви должны обрабатываться одинаково, можно объединить несколько условий ветвей, разделяя их запятыми:

when (x) {
    0, 1 -> print("x == 0 or x == 1")
    else -> print("otherwise")
}

Мы также можем проверить, находится ли значение в диапазоне или коллекции (in) или не находится (!in):

when (x) {
    in 1..10 -> print("x is in the range")
    in validNumbers -> print("x is valid")
    !in 10..20 -> print("x is outside the range")
    else -> print("none of the above")
}

Ещё одна возможность — проверить, является ли значение (is) или не является (!is) значением определённого типа. Примечание: Благодаря умным приведениям вы можете получать доступ к методам и свойствам этого типа без каких-либо дополнительных проверок.

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

when также можно использовать для замены цепочки if-else if. Если аргумент не передан, все условия ветвлений являются простыми логическими выражениями, и ветвь выполняется, когда её условие истинно:

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

Примеры

fun main(args: Array<String>) {
    var x = 0
    when (x) {
        0, 1 -> println("x == 0 or x == 1")
        else -> println("otherwise")
    }

    when (x) {
        1 -> println("x == 1")
        2 -> println("x == 2")
        else -> { // 注意这个块
            println("x 不是 1 ,也不是 2")
        }
    }

    when (x) {
        in 0..10 -> println("x 在该区间范围内")
        else -> println("x 不在该区间范围内")
    }
}

Вывод:

x == 0 or x == 1
x 不是 1 ,也不是 2
x 在该区间范围内

Использование in wheninоператора для проверки, содержит ли коллекция экземпляр:

fun main(args: Array<String>) {
    val items = setOf("apple", "banana", "kiwi")
    when {
        "orange" in items -> println("juicy")
        "apple" in items -> println("apple is fine too")
    }
}

Вывод:

apple is fine too
Другие расширения