Trong bài viết này, bạn sẽ tìm hiểu về cấu trúc when trong Kotlin qua các ví dụ khác nhau.

1. Cấu trúc when trong Kotlin 

Cấu trúc when trong Kotlin có thể được coi là sự thay thế cho Câu lệnh switch trong Java. Nó đánh giá một đoạn code trong số nhiều lựa chọn thay thế.

Ví dụ: biểu thức when đơn giản

/*
Cafedev.vn - Kênh thông tin IT hàng đầu Việt Nam
@author cafedevn
Contact: cafedevn@gmail.com
Fanpage: https://www.facebook.com/cafedevn
Instagram: https://instagram.com/cafedevn
Twitter: https://twitter.com/CafedeVn
Linkedin: https://www.linkedin.com/in/cafe-dev-407054199/
*/

fun main(args: Array<String>) {

    val a = 12
    val b = 5

    println("Enter operator either +, -, * or /")
    val operator = readLine()

    val result = when (operator) {
        "+" -> a + b
        "-" -> a - b
        "*" -> a * b
        "/" -> a / b
        else -> "$operator operator is invalid operator."
    }

    println("result = $result")
}

Khi bạn chạy chương trình, kết quả sẽ là:

Enter operator either +, -, * or /
*
result = 60

Chương trình trên lấy input kiểu String từ người dùng (Hãy đọc: Nhận input kiểu String từ người dùng trong Kotlin). Giả sử, người dùng đã nhập *. Trong trường hợp này, biểu thức a * b được ước tính và giá trị được gán cho biến result.

Nếu không có điều kiện nào trong nhánh được thỏa mãn (người dùng không nhập +, -,*, hoặc /), nhánh else sẽ được đánh giá.

Trong ví dụ trên, chúng ta sử dụng when như một biểu thức. Tuy nhiên, không bắt buộc lúc nào cũng phải sử dụng when như một biểu thức. Ví dụ,

/*
Cafedev.vn - Kênh thông tin IT hàng đầu Việt Nam
@author cafedevn
Contact: cafedevn@gmail.com
Fanpage: https://www.facebook.com/cafedevn
Instagram: https://instagram.com/cafedevn
Twitter: https://twitter.com/CafedeVn
Linkedin: https://www.linkedin.com/in/cafe-dev-407054199/
*/

fun main(args: Array<String>) {

    val a = 12
    val b = 5

    println("Enter operator either +, -, * or /")
    val operator = readLine()

    when (operator) {
        "+" -> println("$a + $b = ${a + b}")
        "-" -> println("$a - $b = ${a - b}")
        "*" -> println("$a * $b = ${a * b}")
        "/" -> println("$a / $b = ${a / b}")
        else -> println("$operator is invalid")
    }
}

Khi bạn chạy chương trình, kết quả sẽ là:

Enter operator either +, -, * or /
-
12 - 5 = 7

Ở đây, when không phải là một biểu thức (giá trị trả về từ when không được gán cho bất cứ biến nào). Trong trường hợp này, nhánh else không bắt buộc.

2. Một số trường hợp ít gặp

2.1. Gộp hai hoặc nhiều điều kiện trong nhánh bằng dấu phẩy. Ví dụ,




fun main(args: Array<String>) {

    val n = -1

    when (n) {
        1, 2, 3 -> println("n is a positive integer less than 4.")
        0 -> println("n is zero")
        -1, -2 -> println("n is a negative integer greater than 3.")
    }
}

Khi bạn chạy chương trình, kết quả sẽ là:

n is a negative integer greater than 3.

2.2. Kiểm tra giá trị trong phạm vi. Ví dụ,

fun main(args: Array<String>) {

    val a = 100

    when (a) {
        in 1..10 -> println("A positive number less than 11.")
        in 10..100 -> println("A positive number between 10 and 100 (inclusive)")
    }
}

Khi bạn chạy chương trình, kết quả sẽ là:

A positive number between 10 and 100 (inclusive)

2.3. Kiểm tra xem một giá trị có nằm trong một kiểu dữ liệu nào đó không.

Để kiểm tra xem một giá trị có thuộc một kiểu dữ liệu nào đó trong thời gian chạy hay không, chúng ta có thể sử dụng toán tử is and !is. Ví dụ,

when (x) {
    is Int -> print(x + 1)
    is String -> print(x.length + 1)
    is IntArray -> print(x.sum())
}

2.4. Sử dụng các biểu thức như các nhánh chứa điều kiện. Ví dụ,

fun main(args: Array<String>) {

    val a = 11
    val n = "11"

    when (n) {
        "cat" -> println("Cat? Really?")
        12.toString() -> println("Close but not close enough.")
        a.toString() -> println("Bingo! It's eleven.")
    }
}

Khi bạn chạy chương trình, kết quả sẽ là:

Bingo! It's eleven.