Mục lục
ToggleTrong bài viết này, chúng ta cùng nhau tìm hiểu về cú pháp cơ bản trong lập trình Kotlin. Về bản chất, các cú pháp cơ bản trong Kotlin cũng tương tự như các ngôn ngữ lập trình khác, đặc biệt là java… Hi vọng rằng bài viết này sẽ giúp bạn hiểu nhanh và rõ ràng hơn về cú pháp lập trình Kotlin.
Tìm hiểu thêm Kotlin là gì và hướng dẫn cài đặt Kotlin
Khai báo Package được đặt trên cùng của file mã nguồn chương trình.
package my.demo import kotlin.text.* // ...
Tên của package không nhất thiết phải khớp với cấu trúc thư mục của tệp tin.
Entry point của ứng dụng Kotlin là hàm main, hàm main được định nghĩa như sau
fun main() { println("Hello world!") }
Ngoài ra hàm main trong kotlin có thể nhận một mảng các tham số đầu vào dưới dạng String như sau
fun main(args: Array<String>) { println(args.contentToString()) }
Không giống trong Java, đển in dữ liệu ra màn hình với Kotlin sẽ sử dụng hàm Print hoặc Println để in dữ liệu theo từng dòng. Xem thêm bài viết chương trình hello world trong Kotlin.
print("Hello ") print("world!") //Kết quả: Hello world!
Hàm println ngoài việc in dữ liệu ra sẽ chèn xuống dòng sau mỗi lần thực thi
println("Hello world!") println(42) //Kết quả: Hello world! 42
Hàm trong Kotlin được định nghĩa như sau
fun tên hàm (tham số: kiểu dữ liệu): kiểu trả về{ // nội dung hàm }
Ví dụ một hàm với 2 tham số là kiểu Int và kiểu trả về là Int sẽ được định nghĩa như sau:
fun sum(a: Int, b: Int): Int { return a + b }
nội dung một có thể là 1 dạng biểu thức, kiểu dữ liệu trả về được tự động suy ra.
fun sum(a: Int, b: Int) = a + b
Từ khóa val trong kotlin dùng để khai báo biến chỉ được phép đọc (Read-only variable). Các biến dạng này chỉ được phép gán dữ liệu 1 lần duy nhất.
val a: Int = 1 // immediate assignment val b = 2 // `Int` type is inferred val c: Int // Type required when no initializer is provided c = 3 // deferred assignment
Từ khóa var dùng đề khai báo biến có thể gán dữ liệu nhiều lần
var x = 5 // `Int` type is inferred x += 1
Biến cũng có thể khai bảo ở ngoài phạm vi hàm
val PI = 3.14 var x = 0 fun incrementX() { x += 1 }
Để định nghĩa một class chúng ta sử dụng từ khóa class, ví dụ
class Shape
Các thuộc tính của 1 lơp cso thể được liệt kê trong phần khai báo hoặc phần thân của class đó.
class Rectangle(var height: Double, var length: Double) { var perimeter = (height + length) * 2 }
Hàm khởi tạo mặc định với tham số được liệt kê trong phần định nghĩa class có thể truy cập được từ instance
val rectangle = Rectangle(5.0, 2.0) println("The perimeter is ${rectangle.perimeter}")
Để thực hiện kế thừa class với Kotlin chúng ta sử dụng dấu hai chấm (:). Mặc định các class ở dạng final, để một class có thể kế thừa cần sử dụng từ khóa open
open class Shape class Rectangle(var height: Double, var length: Double): Shape() { var perimeter = (height + length) * 2 }
Giống như hầu hết các ngôn ngữ lập trình khác, Kotlin hỗ trợ comment dạng 1 dòng và nhiều dòng (single line comment và mult-line/block comment)
// This is an end-of-line comment /* This is a block comment on multiple lines. */
Với comment dạng block có thể ở dạng lồng nhau
/* The comment starts here /* contains a nested comment */ and ends here. */
var a = 1 // simple name in template: val s1 = "a is $a" a = 2 // arbitrary expression in template: val s2 = "${s1.replace("is", "was")}, but now is $a"
Template trong Kotlin 1 phần nào đó giống với PHP và 1 phần nào đó giống với Javascript. Các bạn có thể xem thêm các hàm xử lý chuỗi trong Kotlin.
Sử dụng biểu thức điều kiện if trong Kotlin cũng tương tự như các ngôn ngữ lập trình khác.
fun maxOf(a: Int, b: Int): Int { if (a > b) { return a } else { return b } }
Lệnh if cũng có thể viết dạng ngắn gọn hơn như sau
fun maxOf(a: Int, b: Int) = if (a > b) a else b
Để tạo ra một mảng, ta có thể dùng hàm listOf với tham số truyền vào là danh sách các phần tử.
Các bạn cũng có thể tham khảo thêm các hàm xử lý mảng trong Kotlin
val items = listOf("apple", "banana", "kiwifruit") for (item in items) { println(item) } //Kết quả apple banana kiwifruit
Để lấy thứ tự phần tử trong mảng ta sử dụng từ khóa indices
val items = listOf("apple", "banana", "kiwifruit") for (index in items.indices) { println("item at $index is ${items[index]}") } //kết quả: item at 0 is apple item at 1 is banana item at 2 is kiwifruit
val items = listOf("apple", "banana", "kiwifruit") var index = 0 while (index < items.size) { println("item at $index is ${items[index]}") index++ }
Trong ngôn ngữ lập trình Kotlin không có switch case thay vào đó là biểu thức when
fun describe(obj: Any): String = when (obj) { 1 -> "One" "Hello" -> "Greeting" is Long -> "Long" !is String -> "Not a string" else -> "Unknown" }
Để kiểm tra 1 số có nằm trong range hay không sử dụng toán tử in
val x = 10 val y = 9 if (x in 1..y+1) { println("fits in range") } //kết quả fits in range
Kiểm tra 1 số nằm ngoài khoảng range
val list = listOf("a", "b", "c") if (-1 !in 0..list.lastIndex) { println("-1 is out of range") } if (list.size !in list.indices) { println("list size is out of valid list indices range, too") } //kết quả -1 is out of range list size is out of valid list indices range, too
In các phần tử trong 1 range – iterate
for (x in 1..5) { print(x) } //kết quả 12345
Ngoài ra có thể thay đổi bước nhảy, ví dụ là bước nhảy bằng 2
for (x in 1..10 step 2) { print(x) } //kết quả 13579
In các phần tử theo chiều giảm dần
for (x in 9 downTo 0 step 3) { print(x) } //kết quả 9630
Collection có thể hiểu rằng là tập hợp các phần tử tương tự như một array.
for (item in items) { println(item) }
Kiểm tra 1 collection có chứa 1 đối tượng – object bằng cách sử dụng toán tử in
when { "orange" in items -> println("juicy") "apple" in items -> println("apple is fine too") }
Sử dụng biểu thức lambda để lọc và map collection:
val fruits = listOf("banana", "avocado", "apple", "kiwifruit") fruits .filter { it.startsWith("a") } .sortedBy { it } .map { it.uppercase() } .forEach { println(it) } //kết quả APPLE AVOCADO
Kiểu dữ liệu tham chiếu phải được đánh dấu là Nullable khi nó có thể nhận giá trị null. Kiểu Nullable có ? ở cuối.
Hàm dưới đây sẽ trả về null nếu str không chưa một số nguyên.
fun parseInt(str: String): Int? { // ... }
Cách sử dụng một hàm trả về giá trị nullable:
Chúng ta phải check các biến dữ liệu khác null trước khi thực hiện.
fun printProduct(arg1: String, arg2: String) { val x = parseInt(arg1) val y = parseInt(arg2) // Using `x * y` yields error because they may hold nulls. if (x != null && y != null) { // x and y are automatically cast to non-nullable after null check println(x * y) } else { println("'$arg1' or '$arg2' is not a number") } }
Hoặc ta có thể sử dụng như sau
// ... if (x == null) { println("Wrong number format in arg1: '$arg1'") return } if (y == null) { println("Wrong number format in arg2: '$arg2'") return } // x and y are automatically cast to non-nullable after null check println(x * y)
Toán tử is kiểm tra nếu 1 biểu thức là 1 instance (thực thể) của 1 kiểu dữ liệu. Nếu 1 biến hoặc một thuộc tính local được kiểm tra xem có phải 1 kiểu dữ liệu cụ thể nào không, thì không cần phải ép kiểu một cách tường minh.
fun getStringLength(obj: Any): Int? { if (obj is String) { // obj được tự động ép kiểu sang kiểu String return obj.length } // obj vẫn là kiểu Any nằm ngoài nhánh check kiểu dữ liệu return null }
Hoặc
fun getStringLength(obj: Any): Int? { if (obj !is String) return null // `obj` tự động ép kiểu sang String trong nhánh này return obj.length }
Hoặc thậm chí là như sau
fun getStringLength(obj: Any): Int? { // `obj` is automatically cast to `String` on the right-hand side of `&&` if (obj is String && obj.length > 0) { return obj.length } return null }
Trong bài viết này Codetutam đã gợi ý các cú pháp cơ bản liên quan tới Kotlin. Để tìm hiểu rõ thêm về các cú pháp cơ bản cũng như nâng cao của Kotlin các bạn có thể xem thêm trên trang chủ của ngôn ngữ Kotlin.
Nếu bạn muốn thực hiện ngay một app nho nhỏ nào để rèn luyện kiến của mình. Các bạn có thể tham khảo bài hướng dẫn viết tool gửi tin nhắn trong Android.
Bài viết được dịch từ https://kotlinlang.org/docs/basic-syntax.html
Bình luận: