Xin chào, Mình là Dương Vũ, ở bài viết trước mình đã nói về cách truy xuất biến một cách an toàn. Bài này mình sẽ trình bày về các cấu trúc vòng lặp và điều kiện trong Kotlin. Vòng lặp và điều kiện là những tính năng không thể thiếu đối với 1 ngôn ngữ lập trình hiện đại. Và Kotlin còn làm cho chúng trở nên vô cùng thú vị. Cùng tìm hiểu nhé.
[toc]
Các cấu trúc điều kiện
Cấu trúc if và if else
Cấu trúc if kiểm tra tính thoả mãn của 1 điều kiện và thực hiện một (chuỗi) hành động nếu điều kiện đó thoả mãn. Nếu bạn đã từng làm việc với java, bạn sẽ thấy cấu trúc if và if else của Kotlin sử dụng giống hệt như Java. Đây là 1 ví dụ với việc sử dụng if:
val age = 20 if(age>18){ print("You are adult") }
bởi điều kiện của cấu trúc if (age>18) thoả mãn, Màn hình sẽ hiển thị dòng log You are adult. 1 ví dụ với if – else:
val a = 10 val b = 20 if(a>b){ print("$a > $b") }else if(a == b){ print("$a = $b") }else{ print("$a < $b") }
Màn hình sẽ hiển thị ra dòng log 10<20.
Tuy nhiên ngoài cách sử dụng truyền thống ra, ta có thể dùng cấu trúc if như 1 biểu thức, tức là biểu thức if cũng trả về giá trị, sau đây là ví dụ:
val firstNumber = 10 val secondNumber = 25 var max = if(firstNumber>secondNumber){ println("$firstNumber is max") firstNumber }else{ println("$secondNumber is max") secondNumber } println("Max = $max")
Ta thấy trên đây là bài toán tìm max của 2 số rất đơn giản. Cái hay là trong Kotlin, cấu trúc if có thể return về giá trị và giá trị đó có thể được gán cho 1 biến. Như ở ví dụ trên nếu firstNumber > secondNumber thì cấu trúc if sẽ return về giá trị firstNumber, ngược lại sẽ return về giá trị secondNumber. Chạy đoạn code trên ta sẽ thu được
25 is max Max = 25
Lưu ý: nếu bạn sử dụng if dưới dạng 1 biểu thức, thì cấu trúc if bắt buộc phải có else.
Cấu trúc when
Cấu trúc when tương tự như switch – case của Java hay C. Đây cũng là 1 cấu trúc điều kiện mình rất hay sử dụng. Nó có dạng như thế này
val age = 19 when (age){ in 1..17 -> print("Child") in 18..40 -> print("Adult") else -> print("Old") }
Cấu trúc when kiểm tra tham số đầu vào (ở trường hợp trên là number) với các điều kiện trong thân cấu trúc. Khi bắt gặp điều kiện đúng, các câu lệnh tương ứng với điều kiện đó sẽ được thực hiện và các điều kiện khác sẽ không được xét đến nữa.
Nếu như trong java, các nhánh điều kiện trong cấu trúc switch – case chỉ có thể là hằng số, thì cấu trúc when trong Kotlin tỏ ra mềm dẻo hơn với việc cho phép các điều kiện có thể là các biểu thức, hoặc hàm. Ví dụ:
var numberOne = 19 var numberTwo = 21 when(numberOne){ numberTwo/2 -> println("$numberOne = $numberTwo /2") else -> print("$numberOne != $numberTwo /2") }
Ví dụ trên kiểm tra xem numberOne có phải là 1 nửa của numberTwo hay không. Ví dụ có vẻ ngu ngốc nhưng mô tả rõ ràng việc sử dụng biến trong các nhánh điều kiện của when :)) Khi chạy đoạn code trên ta thu đc dòng log: 19 != 21 /2.
Nếu ta thay giá trị của numberTwo = 38 thì ta sẽ thấy log 19 = 38 /2.
Vậy ta có cấu trúc tổng quát của when là thế này
when(tên_biến){ điều_kiện_1 -> { chuỗi lệnh xử lý 1 } điều_kiện_2 -> { chuỗi lệnh xử lý 2 } …… else -> { chuỗi lệnh xử lý ngoại lệ } }
Lưu ý: nếu chỉ có 1 dòng lệnh thì ta có thể không dùng cặp { }
Vòng lặp
Vòng lặp được sinh ra để thực hiện lặp đi lặp lại 1 công việc nào đó. Kotlin cung cấp cho ta 3 dạng vòng lặp là while, do … while và for. Mình sẽ tìm hiểu từng loại 1 nhé.
Vòng lặp while
Đây là 1 dạng vòng lặp có điều kiện. Vòng lặp sẽ chạy chừng nào điều kiện đó vẫn còn đang đúng. Nếu ai đã code Java thì sẽ thấy vòng lặp while trong Kotlin không khác gì Java cả. Ví dụ:
var age = 1 while (age<100){ println("Now i am $age years old") age++ } print("i die T_T")
Trên đây là ví dụ về vòng đời của 1 người. Vòng lặp sẽ chạy chừng nào điều kiện age<100 còn thỏa mãn. Và các bạn thấy khi run đoạn lệnh trên console sẽ hiển thị:
Now i am 2 years old Now i am 3 years old … Now i am 100 years old i die T_T
Vòng lặp do … while
var age = 1 do { println("Now i am $age years old") age++ } while (age <= 100) print("i die T_T")
Đây là cách viết khác của ví dụ vòng đời trên sử dụng vòng lặp do … while. Vẫn là sống từ 1 đến 100 tuổi rồi chết. Vòng lặp do … while thực tế cũng gần giống như vòng lặp while. Cũng là dạng vòng lặp có điều kiện. Chỉ khác 1 điều là, ở vòng chạy đầu tiên thì điều kiện sẽ không được xem xét. Có nghĩa là với vòng lặp do … while, sẽ có ít nhất 1 vòng được thực thi. Để thấy rõ, bạn hãy thử đặt giá trị khởi tạo của biến age là 101. Khi đó dù age không thoả mãn điều kiện (age <= 100) nhưng vẫn sẽ có 1 câu lệnh được in ra: Now i am 101 years old.
Vòng lặp for
Vòng lặp for duyệt qua tất cả các phần tử trong 1 mảng (array) hoặc danh sách (list) và xử lý giá trị ứng với mỗi phần tử. Ví dụ:
for (i in 1..5) { print("$i ") // in ra 1 2 3 4 5 }
Ok, giờ ta muốn mỗi vòng lặp nhảy 2 đơn vị thì sao? Ta sẽ làm thế này:
for (i in 1..5 step 2) { print("$i ") // in ra 1 3 5 }
Đơn giản là thêm từ khoá step và cuối điều kiện lặp.
Thế nếu ta muốn duyệt từ 5 trở về 1 thì sao? Ta có từ khoá downto giúp ta làm việc đó:
for (i in 5 downTo 1) { print("$i ") //in ra 5 4 3 2 1 }
Và duyệt từ 5 trở về 1, mỗi vòng lặp nhảy 2 đơn vị:
for (i in 5 downTo 1 step 2) { print("$i ") //in ra 5 3 1 }
Sử dụng vòng for để duyệt qua các phần tử của 1 mảng (Array):
val listOfNumber = listOf<Int>(1, 2, 3, 4, 5, 6) for (number in listOfNumber){ if(number%2==0){ println("$number is even number") }else{ println("$number is odd number") } }
Ví dụ trên khởi tạo 1 list các số nguyên và duyệt qua list đó, in ra console tính chẵn lẻ của từng phần tử. Đơn giản đến mức ko thể giải thích rõ hơn, đúng ko? Thêm 1 ví dụ nữa nhé:
val listName = arrayOf("Neymar", "Vidal", "Rooney", "Ronaldo", "Messi", "Bale") for (name in listName) { if (name.startsWith("R")) { println(name) } }
Ví dụ trên khởi tạo 1 mảng các tên cầu thủ, sau đó sử dụng vòng lặp để duyệt qua tất cả các phần tử trong mảng đó, phần tử nào bắt đầu bằng ký tự R thì sẽ log ra màn hình. Kết quả:
Rooney Ronaldo
Ngoài cách trên ra ta cũng có thể duyệt mảng bằng cách khác, đó là duyệt qua chỉ số:
val listNumber = listOf<Int>(1, 3, 2, -1, 4, 6, 7) var sum = 0 for (index in 0..listNumber.size - 1) { sum += listNumber.get(index) } print("Summary of list: $sum")
Đây là bài toán đơn giản tính tổng 1 mảng. Nhưng ở ví dụ này ta duyệt mảng thông qua chỉ số (thứ tự) chứ ko duyệt trực tiếp qua các phần tử của listNumber. Bản chất của việc này là ta tạo ra 1 list chỉ số: 0..listNumber.size – 1 gồm các giá trị từ 0 đến listNumber.size – 1. Sau đó ta duyệt list này để lấy các chỉ số (index) của listNumber và truy xuất các phần tử của listNumber thông qua index, phục vụ cho việc tính tổng.
Break và continue
Lưu ý: break và continue trong Kotlin giống hệt như trong java, anh em nào biết rồi thì có thể bỏ qua không đọc :))
break và continue là 2 từ khóa để tạo ra các bước nhảy trong vòng lặp. Cụ thể:
break dùng để thoát ra khỏi vòng lặp.
continue dùng để lập tức chuyển tới vòng lặp tiếp theo, bỏ qua các câu lệnh còn lại của vòng lặp hiện tại.
break và continue có thể dùng được trong mọi thể loại vòng lặp, dù có là for hay while hay là do – while vẫn ok tất. Ví dụ về break
for(age in 1..100){ println("Now i am $age years old") if(age == 25){ println("i see girl when ride motorbike, then i hug a big tree in the road") break } } print("i die T_T")
Vẫn là ví dụ về vòng đời, nhưng ở đây có chút khác biệt. Khi age có giá trị là 25, thanh niên console đi xe máy ra ngoài đường và ngắm gái, kết quả là đâm vào cây và hẹo. Thế nên ta dùng lệnh break để thoát khỏi vòng lặp for(age in 1..100) dù age mới có giá trị là 25. Kết quả hiện ra trên màn hình
Now i am 1 years old Now i am 2 years old ….. Now i am 25 years old i see girl when ride motorbike, then i hug a big tree in the road i die T_T
Ví dụ về continue:
var level = 1 while (level <= 10) { if (level == 3) { level += 6 println("I have a special gift code, my level up!!!") continue } println("My level is $level") level++ }
Đây là 1 ví dụ về 1 anh cày game, ở mỗi level của anh ấy đều có 1 dòng log println(“My level is $level”), tuy nhiên khi đang ở level 3 thì anh ấy nhận được gift code khủng nên nhảy 1 phát lên level 9: level += 6 và bỏ qua dòng log println(“My level is $level”) ở vòng lặp khi level = 3. Điều này có được nhờ câu lệnh continue, nó sẽ bỏ qua tất cả những câu lệnh ở phía sau nó (trong vòng lặp) và lập tức chuyển sang vòng lặp tiếp theo.
Ví dụ khác:
for (number in 1..10) { if (number % 2 == 0) { continue } print("Number = $number") }
Tổng kết
Như vậy, cơ bản mình đã trình bày xong về Các cấu trúc vòng lặp và điều kiện trong Kotlin.
Đến đây ta đã có những trang bị kiến thức:
- Các kiểu dữ liệu cơ bản
- Các kiểu dữ liệu mảng, danh sách
- Kiểu dữ liệu nullable, các cách sử dụng biến an toàn (tránh NullPoiterException)
- Cấu trúc điều kiện if, if-else, when
- Các dạng vòng lặp for, while
- Các cách ngắt vòng lặp sử dụng break, continue
Đây là các thành phần cơ bản nhất mà ngôn ngữ nào cũng phải cung cấp. Đối với ai đã từng làm với Java chắc ko có khó khăn gì. Bài tiếp theo sẽ bắt đầu trình bày về các kiến thức liên quan đến cách sử dụng hàm trong Kotlin. Và những sự ưu việt của Kotlin so với Java (tất nhiên là về cú pháp). Rất mong các bạn sẽ ủng hộ mình.
One thought on “Kotlin Bài 4: Các cấu trúc vòng lặp và điều kiện trong Kotlin”