Kotlin Control Flow
Bài đăng này đã không được cập nhật trong 6 năm
Xin chào các bạn, chào mừng các bạn quay trở lại với seri bài viết về Kotlin cho người mới bắt đầu.
Ở bài viết trước mình đã hướng dẫn các bạn về Class, variable và function. Trong bài viết lần này mình sẽ hướng dẫn cho các bạn cách sử dụng về package và control flow
1 Package.
package foo.bar
fun baz() { ... }
class Goo { ... }
// 
Cũng như Java tất cả các classes functions của một file đều đựoc khai báo trong một package, và như ở ví dụ trên tên đầy đủ của function baz() sẽ là foo.bar.baz và full name của class Goo sẽ là
foo.bar.Goo
Nếu package không được khai báo thì tất cả nội dung trong fole đó thuộc về package default (package ko có tên)
2. Import
Trong Kotlin tất cả các file *.kt đều được mwajc định import các gói sau
- kotlin.*
- kotlin.annotation.*
- kotlin.collections.*
- kotlin.comparisons.* (since 1.1)
- kotlin.io.*
- kotlin.ranges.*
- kotlin.sequences.*
- kotlin.text.*
Tùy từng nền tảng sẽ có thêm một vài package bổ sung
- JVM
- java.lang.*
- kotlin.jvm.*
 
- JS
- kotlin.js.*
 
3. Control flow
3.1 If expression
Khác một chút với Java, if trong Kotlin là một biếu thức, nó có thể trả về một giá trị. Do đó toán tử 3 ngôi (condition? then: else ví dụ trong java boolean isEvenNumber = number % 2 == 0? true : false;) sẽ không có trong Kotlin bới vì if trong kotlin đã làm được việc này rồi
// Traditional usage 
var max = a 
if (a < b) max = b
// With else 
var max: Int
if (a > b) {
    max = a
} else {
    max = b
}
 
// As expression 
val max = if (a > b) a else b
các nhánh của if có thể là các block code (khối lệnh), và biểu thức cuối cùng sẽ là giá trị của khối lệnh, và khi các bạn sử dụng if như một biểu thức thì bắt buộc phải có nhánh else.
val max = if (a > b) {
    print("Choose a")
    a
} else {
    print("Choose b")
    b
}
3.2 When expression
Trong java chúng ta có switch thì đối với Kotlin có when, theo mình đánh giá thì when trong kotlin mạnh mẽ hơn nhiều lần so với switch trong java
Một biểu thức when sẽ có dạng như sau
when (x) {
    1 -> print("x == 1")
    2 -> print("x == 2")
    else -> { // Note the block
        print("x is neither 1 nor 2")
    }
}
when sẽ kiểm tra giá trị truyền vào với lần lượt các biểu thức trong when, nếu điều kiện nào được thoả mãn, nó sẽ dừng lại ở đó theo thứ tự từ trên xuống dưới. Nếu không có bất kì điều kiện nào được thỏa mãn thì else sẽ được gọi.
Trong nhiều truờng hợp có thể xử lý theo cùng 1 cách, các bạn có thể sử dụng dấu ,
when (x) {
    0, 1 -> print("x == 0 or x == 1")
    else -> print("otherwise")
}
Có thể sử dụng các biểu thức tùy ý làm điều kiện cho các nhánh
Khác với switch - các case bắt buộc phải là hằng số, còn ở Kotlin bạn có thể sử dụng các biểu thức, biến tùy ý
when (x) {
    parseInt(s) -> print("s encodes x")
    else -> print("s does not encode x")
}
Có thể check xem một gía trị có thể nằm trong khoảng, hoặc nằm ngoài khoảng giá trị nào đó
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")
}
Có thể kiểm tra xem gía trị truyền vào có hoặc không thuộc một loai dữ liệu nhất định
Cái này na ná giống như isInstanceOf trong java. Chỉ khác là các bạn sẽ sử dụng từ khóa is hoặc !is.
fun hasPrefix(x: Any) = when(x) {
    is String -> x.startsWith("prefix")
    else -> false
}
Có thể sử dụng như một biểu thức
Khác với switch, trong kotlin when (từ version Kotlin 1.3 trở lên) cũng có thể sử dụng như một biểu thức  như if mình đã đề cập ở trên. (ví dụ)
fun Request.getBody() =
        when (val response = executeRequest()) {
            is Success -> response.body
            is HttpError -> throw HttpException(response.status)
        }
Và cũng giống như if khi sử dụng when như một biểu thức thì bắt buộc phải có trường hợp else trừ trường hợp trình biên dịch có thể chứng minh rằng tất cả các trường hợp đã được thỏa mãn và không cần tới else. (cái này các bạn có thể hiểu nó giống như các câu lệnh if-else if lồng nhau vậy.
3.3 For loops
Sử dụng như foreach trong Java và các ngôn ngữ khác
Vòng lặp for có thể được sử dụng đối với bất cứ thứ gì mà được hỗ trợ interator.  Nó tuơng đuơng với foreach trong Java
Cú pháp như sau
for (item in collection) print(item)
Trường hợp body có thể là khối lệnh
for (item: Int in ints) {
    // ...
}
Sử dụng for trong một khoảng số
For cũng có thể sử dụng cho một dãy số bằng cáhc sử dụng như sau
for (i in 1..3) {
    println(i)
}
for (i in 6 downTo 0 step 2) {
    println(i)
}
Nó tuơng đương với đoạn code sau trong java nhưng cú pháp thì dễ đọc và có vẻ gần guĩ với ngôn ngữ tự nhiên hơn rất nhiều.
for (int i = 1; i<=3; i++)
for (int i = 6; i<=0; i-=2)
3.4 While
Trong kotlin, thì while và do-while cũng được sử dụng giống như trong Java, k có gì khác cả.
while (x > 0) {
    x--
}
do {
    val y = retrieveData()
} while (y != null) // y is visible here!
5. Reference https://kotlinlang.org
Trong bài viết lần này, mình đã hướng dẫn cho các bạn cách sử dụng của các control flow cơ bản trong Kotlin, theo mình đánh giá thì nó tuơng đối dễ đọc và gần gũi với ngôn ngữ tự nhiên, và đặc biệt mình nghĩ nó cực kì mạnh mẽ. Trong bài viết tới mình sẽ giới thiệu với các bạn một số class đặc biệt trong Kotlin. Hi vong các bạn sẽ tiếp tục theo dõi seri này của mình.
Rất cám ơn các bạn đã đón đọc. Chúc các bạn học kotlin hiệu quả.
All rights reserved
 
  
 