Lập trình Kotlin — Dòng điều khiển

Liem Vo
Viet Android Developers
5 min readAug 9, 2020

Trong bài học trước chúng ta đã được học về packages và cách imports. Trong bài học hôm nay chúng ta sẽ tìm hiểu về một kỹ thuật khác của Kotlin đó là dòng điều khiển.

If-else

Kotlin là ngôn ngữ lập trình hàm và giống như các ngôn ngữ lập trình khác, if sẽ trả về một kết quả. Ở đây if không hỗ trợ ?: giống như Java.

Giờ chúng ta sẽ thực hiện so sánh 2 số với if:

val a = 3
val b = 8

var max = a
if (b > max) max = b

Ở trên là cách dùng if, chúng ta có thể dùng if else và không gán giá trị ban đầu cho max. Thay vì dùng if ở trên ta có thể dùng if else

var max : Int
if (a > b) {
max = a
} else {
max = b
}

Trong lập trình Kotlin chúng ta có thể thay biến max có thể thay đổi thành `val` là kiểu dữ liệu không đổi xem thêm phần cú pháp cơ bản. Chúng ta có thể thêm nhiều dòng lệnh bất kỳ trong phần dấu ngoặc nhọn và Kotlin chỉ lấy giá trị của dòng cuối cùng.

val max = if (a > b) {
println("Chọn $a")
a
} else {
println("Chọn $b")
b
}

Nếu điều kiện if else ngắn và có thể chuyển sang một dòng thì nên dùng một dòng, điều kiện so sánh ở ví dụ này sẽ được viết lại

val max = if (a > b) a else b

Điều kiện when

When thay thế switch trong lập trình C. Ví dụ chúng ta có đoạn code sau

val a: Any = 6

if (a is Byte) {
println("a is byte")
} else if (a is Short) {
println("a is Short")
} else if (a is Int) {
println("a is Int")
} else {
println("we don't know")
}

Nếu các bạn đã biết về cách khai báo kiểu dữ liệu trong Kotlin thì kết quả trên sẽ là “a is Int”. Xem thêm video các kiểu dữ liệu trong Kotlin

Ở đoạn code trên có rất nhiều if else và làm chúng ta hơi khó để hiểu và chúng ta có thể dùng when thay thế

when (a) {
is Byte -> {
println("a is byte")
}
is Short -> {
println("a is Short")
}
is Int -> {
println("a is Int")
}
else -> {
println("we don't know")
}
}

Kết quả của dùng when sẽ cho kết quả như việc dùng if else ở trên. Việc dùng when sẽ phân nhánh rõ ràng và nếu một nhánh đã thoả mãn điều kiện thì kết quả của toàn bộ when. Ở mỗi nhánh chúng ta có thể có dấu ngoặc nhọn cho một đoạn code nhiều dòng hoặc không cần dấu ngoặc nhọn cho một dòng code duy nhất.

Đoạn code trên có thể viết lại ngắn hơn:

when (a) {
is Byte -> println("a is byte")
is Short -> println("a is Short")
is Int -> println("a is Int")
else -> println("we don't know")
}

Cả hai lần dùng when đều cho kết quả giống if else ở trên.

  • When ở đây thường có giá trị, kết quả của một hàm, hoặc một biểu thức (kiểm tra range, so sánh,…)
  • When có thể dùng để thay thế if else, if else if

Từ Kotlin 1.3 kết quả trả về của một biểu thức hoặc hàm có thể được dùng trong nhánh của when.

fun checkOdd(a: Int) = a % 2 == 0
val a = 6
val result = when(val isOdd = checkOdd(a)) {
true -> isOdd.toString()
else -> "Not"
}

println(result)

Kết quả sẽ in ra “true

Vòng lặp For

Dùng for để duyệt theo các phần tử hoặc một số phần tử trong dãy để thực hiện việc xử lý bạn mong muốn.

Ví dụ:

val array = arrayOf(1 , 3 ,4 , 5, 6)
for(item in array) println(item)

Ở đây chúng ta sẽ có một dãy và dùng vòng lặp for để in ra giá trị của mỗi phần tử trong dãy. Kết quả sẽ là:

1
3
4
5
6

Phần thân của for có thể được đặt trong dấu ngoặc nhọn nếu có nhiều dòng code.

For cũng có thể thao tác trên một dãy và có những bước nhảy khác nhau.

for (i in 10 downTo 0 step 3) {
println(i)
}

Kết quả là:

10
7
4
1

Dùng for index

for ((index, item) in array.withIndex()) {
println("value at $index = $item")
}

Kết quả là:

value at 0 = 1
value at 1 = 3
value at 2 = 4
value at 3 = 5
value at 4 = 6

While loop

Cú pháp và cách dùng vòng lặp while không khác các ngôn ngữ khác. Ví dụ

var x = 4
while (x > 0) {
println(x)
x--
}

Ở đây vòng lặp while sẽ kiểm tra điều kiện trước khi thực hiện xử lý code bên trong vòng lặp. Kết quả là:

4
3
2
1

Nếu chuyển đổi đoạn code trên sang vòng lặp do while thì code trong thân của vòng lặp sẽ thực thi và sau đó mới kiểm tra điều kiện. Đoạn code trên được viết lại như sau:

var x = 4
do {
println(x)
x--
} while (x > 0)

Kết quả là:

4
3
2
1

Dùng return, break và continue

Return

Nếu bạn quen dùng lập trình với các ngôn ngữ khác thì việc dùng return là khá quen thuộc.

fun containNumber(a: Int, list: List<Int>): Boolean {
for (i in list) {
if (i == a) return true
}
return false
}
println(containNumber(2, Array(3){ i -> i }.toList() ))

Ở đoạn code trên hàm containNumber sẽ kiểm tra một số nguyên có thuộc trong dãy số cho trước hay không. Nếu thỏa mãn điều kiện thì vòng lặp sẽ thoát và trả về giá trị của hàm. Kết quả trả về của hàm sẽ là true và kết quả in ra là true.

Dùng break và continue

2 từ khoá này được dùng để xử lý một số điều kiện. Đoạn code trên có thể viết lại dùng break và continue

fun containNumber(a: Int, list: List<Int>): Boolean {
var result = false
check@ for (i in list) {
if (i == a) {
result = true
break@check
} else {
continue@check
}
}
return result
}
println(containNumber(2, Array(3){ i -> i }.toList() ))

Kết quả sẽ giống như dùng return. Break và continue dùng với nhãn (label), và ngôn ngữ lập trình Kotlin sẽ có đủ thông minh với nhiều nhãn.

--

--