Chào mừng độc giả Cafedev đến với bài chia sẻ về luồng điều khiển trong Kotlin! Trong thế giới lập trình Kotlin, chúng ta sẽ khám phá cách quản lý luồng của chương trình thông qua các biểu thức điều kiện và vòng lặp. Hãy cùng Cafedev nói về cú pháp sử dụng `if`, `when`, và cách tạo ra các vòng lặp thông qua các cách Kotlin hỗ trợ. Bài viết sẽ giúp bạn hiểu rõ cách kiểm soát luồng chương trình, tạo ra mã nguồn linh hoạt và dễ hiểu. Hãy cùng nhau khám phá thế giới của luồng điều khiển trong Kotlin!

Giống như các ngôn ngữ lập trình khác, Kotlin có khả năng đưa ra quyết định dựa trên việc một đoạn mã có được đánh giá là đúng hay không. Những đoạn code như vậy được gọi là biểu thức điều kiện. Kotlin cũng có khả năng tạo và lặp qua các vòng lặp.

1. Biểu thức điều kiện

Kotlin cung cấp ifwhen để kiểm tra biểu thức điều kiện.

Nếu bạn phải lựa chọn giữa ifwhen, chúng tôi khuyến nghị sử dụng when vì nó làm cho các chương trình mạnh mẽ và an toàn hơn.

1.1 If

Để sử dụng if, thêm biểu thức điều kiện trong dấu ngoặc đơn () và hành động để thực hiện nếu kết quả là đúng trong dấu ngoặc nhọn {}:

fun main() {
//sampleStart
val d: Int
val check = true

if (check) {
d = 1
} else {
d = 2
}

println(d)
// 1
//sampleEnd
}

Kotlin không có toán tử ba ngôi condition ? then : else. Thay vào đó, if có thể được sử dụng như một biểu thức. Khi sử dụng if như một biểu thức, không có dấu ngoặc nhọn {}:

fun main() {
//sampleStart
val a = 1
val b = 2

println(if (a > b) a else b) // Returns a value: 2
//sampleEnd
}

1.2 When

Sử dụng when khi bạn có một biểu thức điều kiện với nhiều nhánh. when có thể được sử dụng như là một câu lệnh hoặc một biểu thức.
Dưới đây là một ví dụ về việc sử dụng when như một câu lệnh:

  • Đặt biểu thức điều kiện trong dấu ngoặc đơn () và các hành động để thực hiện trong dấu ngoặc nhọn {}.
  • Sử dụng -> trong mỗi nhánh để phân tách mỗi điều kiện từ mỗi hành động.
fun main() {
//sampleStart
val obj = "Hello"

when (obj) {
// Checks whether obj equals to "1"
"1" -> println("One")
// Checks whether obj equals to "Hello"
"Hello" -> println("Greeting")
// Default statement
else -> println("Unknown")
}
// Greeting
//sampleEnd
}

Lưu ý rằng tất cả các điều kiện của các nhánh đều được kiểm tra tuần tự cho đến khi một trong chúng được thỏa mãn. Vì vậy, chỉ có nhánh phù hợp đầu tiên được thực thi.
Dưới đây là một ví dụ về việc sử dụng when như một biểu thức. Cú pháp của when được gán ngay lập tức vào một biến:

fun main() {
//sampleStart
val obj = "Hello"

val result = when (obj) {
// If obj equals "1", sets result to "one"
"1" -> "One"
// If obj equals "Hello", sets result to "Greeting"
"Hello" -> "Greeting"
// Sets result to "Unknown" if no previous condition is satisfied
else -> "Unknown"
}
println(result)
// Greeting
//sampleEnd
}

Nếu when được sử dụng như một biểu thức, nhánh else là bắt buộc, trừ khi trình biên dịch có thể xác định rằng tất cả các trường hợp có thể được bao phủ bởi các điều kiện nhánh.
Ví dụ trước đã cho thấy rằng when rất hữu ích để phù hợp với một biến. when cũng hữu ích khi bạn cần kiểm tra một chuỗi biểu thức Boolean:

fun main() {
//sampleStart
val temp = 18

val description = when {
// If temp < 0 is true, sets description to "very cold"
temp < 0 -> "very cold"
// If temp < 10 is true, sets description to "a bit cold"
temp < 10 -> "a bit cold"
// If temp < 20 is true, sets description to "warm"
temp < 20 -> "warm"
// Sets description to "hot" if no previous condition is satisfied
else -> "hot"
}
println(description)
// warm
//sampleEnd
}

2. Khoảng giá trị

Trước khi nói về vòng lặp, việc biết cách xây dựng khoảng giá trị để lặp qua là rất hữu ích.
Cách phổ biến nhất để tạo một khoảng giá trị trong Kotlin là sử dụng toán tử ... Ví dụ, 1..4 tương đương với 1, 2, 3, 4.
Để khai báo một khoảng giá trị không bao gồm giá trị cuối cùng, sử dụng toán tử ..<. Ví dụ, 1..<4 tương đương với 1, 2, 3.
Để khai báo một khoảng giá trị theo chiều ngược lại, sử dụng downTo. Ví dụ, 4 downTo 1 tương đương với 4, 3, 2, 1.
Để khai báo một khoảng giá trị tăng theo một bước khác 1, sử dụng step và giá trị tăng mong muốn. Ví dụ, 1..5 step 2 tương đương với 1, 3, 5.
Bạn cũng có thể làm điều tương tự với khoảng giá trị của Char:
* 'a'..'d' tương đương với 'a', 'b', 'c', 'd'
* 'z' downTo 's' step 2 tương đương với 'z', 'x', 'v', 't'

3. Vòng lặp

Hai cấu trúc vòng lặp phổ biến nhất trong lập trình là forwhile. Sử dụng for để lặp qua một khoảng giá trị và thực hiện một hành động. Sử dụng while để tiếp tục một hành động cho đến khi một điều kiện cụ thể được đáp ứng.

3.1. For

Sử dụng kiến thức mới của bạn về khoảng giá trị, bạn có thể tạo một vòng lặp for lặp qua các số từ 1 đến 5 và in ra số mỗi lần.
Đặt bộ lặp và khoảng giá trị trong dấu ngoặc đơn () với từ khóa in. Thêm hành động bạn muốn thực hiện trong dấu ngoặc nhọn {}:

fun main() {
//sampleStart
for (number in 1..5) {
// number is the iterator and 1..5 is the range
print(number)
}
// 12345
//sampleEnd
}

Các bộ sưu tập cũng có thể được lặp qua bằng vòng lặp:

fun main() {
//sampleStart
val cakes = listOf("carrot", "cheese", "chocolate")

for (cake in cakes) {
println("Yummy, it's a $cake cake!")
}
// Yummy, it's a carrot cake!
// Yummy, it's a cheese cake!
// Yummy, it's a chocolate cake!
//sampleEnd
}

3.2 While

while có thể được sử dụng theo hai cách:
Trong trường hợp sử dụng đầu tiên (while):

  • Khai báo biểu thức điều kiện cho vòng lặp while của bạn để tiếp tục trong dấu ngoặc đơn ().
  • Thêm hành động bạn muốn thực hiện trong dấu ngoặc nhọn {}.

Các ví dụ sau sử dụng toán tử tăng dần ++ để tăng giá trị của biến cakesEaten.

fun main() {
//sampleStart
var cakesEaten = 0
while (cakesEaten < 3) {
println("Eat a cake")
cakesEaten++
}
// Eat a cake
// Eat a cake
// Eat a cake
//sampleEnd
}

Trong trường hợp sử dụng thứ hai (do-while):
* Khai báo biểu thức điều kiện cho vòng lặp while của bạn để tiếp tục trong dấu ngoặc đơn ().
* Định nghĩa hành động bạn muốn thực hiện trong dấu ngoặc nhọn {} với từ khóa do.

fun main() {
//sampleStart
var cakesEaten = 0
var cakesBaked = 0
while (cakesEaten < 3) {
println("Eat a cake")
cakesEaten++
}
do {
println("Bake a cake")
cakesBaked++
} while (cakesBaked < cakesEaten)
// Eat a cake
// Eat a cake
// Eat a cake
// Bake a cake
// Bake a cake
// Bake a cake
//sampleEnd
}


Bây giờ bạn đã biết cơ bản về luồng điều khiển Kotlin, là lúc để học cách viết hàm của riêng bạn.

4. Thực hành

4.1 Bài tập 1

Sử dụng biểu thức when, cập nhật chương trình sau để khi bạn nhập tên các nút của GameBoy, các hành động sẽ được in ra đầu ra.

NútHành động
A
BKhông
XMenu
YKhông gì
KhácKhông có nút nào như vậy
fun main() {
val button = "A"

println(
// Write your code here
)
}

Gợi ý:

fun main() {
val button = "A"

println(
when (button) {
"A" -> "Yes"
"B" -> "No"
"X" -> "Menu"
"Y" -> "Nothing"
else -> "There is no such button"
 }
)

}

4.2 Bài tập 2

Bạn có một chương trình đếm lượng lớn số lượng lát pizza cho đến khi có một chiếc pizza đầy đủ với 8 lát. Tối ưu lại chương trình này theo hai cách sau:
* Sử dụng vòng lặp while.
* Sử dụng vòng lặp do-while.

fun main() {
var pizzaSlices = 0
// Start refactoring here
pizzaSlices++
println("There's only $pizzaSlices slice/s of pizza :(")
pizzaSlices++
println("There's only $pizzaSlices slice/s of pizza :(")
pizzaSlices++
println("There's only $pizzaSlices slice/s of pizza :(")
pizzaSlices++
println("There's only $pizzaSlices slice/s of pizza :(")
pizzaSlices++
println("There's only $pizzaSlices slice/s of pizza :(")
pizzaSlices++
println("There's only $pizzaSlices slice/s of pizza :(")
pizzaSlices++
println("There's only $pizzaSlices slice/s of pizza :(")
pizzaSlices++
// End refactoring here
println("There are $pizzaSlices slices of pizza. Hooray! We have a whole pizza! :D")
}

Gợi ý:

fun main() {
var pizzaSlices = 0
while ( pizzaSlices < 7 ) {
 pizzaSlices++
 println("There's only $pizzaSlices slice/s of pizza :(")
}
pizzaSlices++
println("There are $pizzaSlices slices of pizza. Hooray! We have a whole pizza! :D")
}

|—|—|

fun main() {
var pizzaSlices = 0
pizzaSlices++
do {
 println("There's only $pizzaSlices slice/s of pizza :(")
 pizzaSlices++
} while ( pizzaSlices < 8 )
println("There are $pizzaSlices slices of pizza. Hooray! We have a whole pizza! :D")
}

4.3 Bài tập 3

Viết một chương trình mô phỏng trò chơi Fizz buzz. Nhiệm vụ của bạn là in ra các số từ 1 đến 100 một cách tăng dần, thay thế mọi số chia hết cho ba bằng từ “fizz” và mọi số chia hết cho năm bằng từ “buzz”. Mọi số chia hết cho cả 3 và 5 đều phải được thay thế bằng từ “fizzbuzz”.

fun main() {
// Write your code here
}

Gợi ý:

fun main() {
for (number in 1..100) {
println(
 when {
  number % 15 == 0 -> "fizzbuzz"
  number % 3 == 0 -> "fizz"
  number % 5 == 0 -> "buzz"
  else -> number.toString()
 }
 )
 }
}

4.4 Bài tập 4

Bạn có một danh sách các từ. Sử dụng forif để chỉ in ra các từ bắt đầu bằng chữ l.

fun main() {
val words = listOf("dinosaur", "limousine", "magazine", "language")
// Write your code here
}

Gợi ý:

fun main() {
 val words = listOf("dinosaur", "limousine", "magazine", "language")
 for (w in words) {
 if (w.startsWith("l"))
  println(w)
 }
}

-> Kho tài liệu Free học Kotlin từ A->Z

Cuối cùng,

Cảm ơn bạn đã dành thời gian đọc về quản lý luồng trong Kotlin trên Cafedev! Hy vọng rằng bài chia sẻ này đã giúp các bạn hiểu rõ hơn về cách sử dụng biểu thức điều kiện và vòng lặp để kiểm soát luồng chương trình trong ngôn ngữ lập trình Kotlin. Nếu có bất kỳ thắc mắc hay ý kiến đóng góp, đừng ngần ngại chia sẻ trên cộng đồng Cafedev. Chúng ta cùng xây dựng một cộng đồng vững mạnh và chia sẻ kiến thức lập trình cùng Cafedev!

Các nguồn kiến thức MIỄN PHÍ VÔ GIÁ từ cafedev tại đây

Nếu bạn thấy hay và hữu ích, bạn có thể tham gia các kênh sau của Cafedev để nhận được nhiều hơn nữa:

Chào thân ái và quyết thắng!

Bước tiếp theo

Đăng ký kênh youtube để ủng hộ Cafedev nha các bạn, Thanks you!