Giá trị (Values) và Kiểu dữ liệu (Data Types) trong Kotlin
1. Giới thiệu
Kotlin là ngôn ngữ statically typed (kiểu tĩnh), nghĩa là kiểu dữ liệu của biến được xác định tại compile-time. Tuy nhiên, Kotlin có khả năng type inference (suy luận kiểu) nên bạn không phải luôn khai báo kiểu tường minh.
2. Các kiểu dữ liệu cơ bản trong Kotlin
2.1. Kiểu số (Numbers)
Kotlin cung cấp các kiểu số sau:
| Kiểu | Kích thước | Giá trị min | Giá trị max |
|---|---|---|---|
Byte | 8 bit | -128 | 127 |
Short | 16 bit | -32,768 | 32,767 |
Int | 32 bit | -2,147,483,648 | 2,147,483,647 |
Long | 64 bit | -9,223,372,036,854,775,808 | 9,223,372,036,854,775,807 |
Float | 32 bit | ~6-7 chữ số thập phân | |
Double | 64 bit | ~15-16 chữ số thập phân |
val byteValue: Byte = 127
val shortValue: Short = 32000
val intValue: Int = 2025
val longValue: Long = 9876543210L // Chú ý chữ L ở cuối
val floatValue: Float = 3.14f // Chú ý chữ f ở cuối
val doubleValue: Double = 3.141592653589793Lưu ý quan trọng:
- Số nguyên mặc định là
Int - Số thập phân mặc định là
Double - Phải thêm
LchoLongvàfchoFloat
2.2. Kiểu Boolean
val isKotlinFun: Boolean = true
val isPythonBetter: Boolean = false
val result = (10 > 5) // true2.3. Kiểu ký tự (Char)
val letter: Char = 'A'
val digit: Char = '9'
val symbol: Char = '@'
// Không thể gán chuỗi cho Char
// val wrong: Char = "A" // Lỗi!2.4. Kiểu chuỗi (String)
val name: String = "Kotlin"
val message: String = "Hello, Bumbii Academy!"
val multiLine: String = """
Đây là chuỗi
nhiều dòng
trong Kotlin
""".trimIndent()3. Type Inference (Suy luận kiểu)
Kotlin tự động suy luận kiểu dữ liệu:
val age = 25 // Int
val price = 99.99 // Double
val name = "Alice" // String
val isValid = true // Boolean
val letter = 'K' // Char
// Có thể khai báo tường minh nếu cần
val specificLong: Long = 100
val specificFloat: Float = 100f4. Nullable Types (Kiểu có thể null)
Một trong những tính năng quan trọng nhất của Kotlin là Null Safety. Mặc định, các biến không thể là null:
var name: String = "Kotlin"
// name = null // Lỗi biên dịch!
// Để cho phép null, thêm dấu ?
var nullableName: String? = "Kotlin"
nullableName = null // OKChúng ta sẽ học chi tiết về Null Safety trong bài riêng.
5. Kiểm tra kiểu dữ liệu
5.1. Sử dụng toán tử is
val value: Any = "Hello"
if (value is String) {
println("Đây là chuỗi: ${value.length}")
}
if (value !is Int) {
println("Không phải số nguyên")
}5.2. Smart Casting
Kotlin tự động chuyển kiểu sau khi kiểm tra:
fun printLength(obj: Any) {
if (obj is String) {
// obj tự động được cast thành String
println("Độ dài: ${obj.length}")
}
}6. Chuyển đổi kiểu dữ liệu
Kotlin không tự động chuyển đổi kiểu số. Phải sử dụng các hàm chuyển đổi tường minh:
val intValue: Int = 10
val longValue: Long = intValue.toLong()
val doubleValue: Double = intValue.toDouble()
val stringValue: String = intValue.toString()
// Các hàm chuyển đổi:
// toByte(), toShort(), toInt(), toLong()
// toFloat(), toDouble()
// toChar(), toString()Lỗi thường gặp:
val a: Int = 10
val b: Long = 20
// val sum = a + b // Lỗi: Type mismatch
// Đúng:
val sum = a.toLong() + b
// hoặc
val sum2 = a + b.toInt()7. Kiểu Any, Unit, Nothing
7.1. Any - Kiểu cha của tất cả
Any tương tự Object trong Java hoặc object trong Python:
val anything: Any = "Hello"
val number: Any = 42
val flag: Any = true7.2. Unit - Kiểu không trả về giá trị
Unit tương tự void trong Java hoặc None trong Python:
fun printMessage(): Unit {
println("Hello")
}
// Có thể bỏ qua Unit
fun printMessage() {
println("Hello")
}7.3. Nothing - Kiểu không bao giờ trả về
Nothing dùng cho các hàm luôn throw exception:
fun fail(message: String): Nothing {
throw IllegalStateException(message)
}8. So sánh với Python
| Kotlin | Python | Ghi chú |
|---|---|---|
Int | int | Số nguyên |
Double | float | Số thực |
String | str | Chuỗi |
Boolean | bool | True/False |
Char | Không có | Ký tự đơn |
Any | object | Kiểu cha |
Unit | None | Không trả về |
String? | Optional[str] | Nullable |
9. Ví dụ thực tế
fun main() {
// Khai báo các biến với type inference
val age = 25
val height = 1.75
val name = "Nguyễn Văn A"
val isStudent = true
println("Tên: $name")
println("Tuổi: $age")
println("Chiều cao: $height m")
println("Là sinh viên: $isStudent")
// Kiểm tra kiểu
println("\nKiểu dữ liệu:")
println("age là Int: ${age is Int}")
println("height là Double: ${height is Double}")
println("name là String: ${name is String}")
// Chuyển đổi kiểu
val ageAsDouble = age.toDouble()
val heightAsString = height.toString()
println("\nSau khi chuyển đổi:")
println("age as Double: $ageAsDouble")
println("height as String: $heightAsString")
}10. Best Practices
- Sử dụng type inference khi kiểu dữ liệu rõ ràng
- Khai báo kiểu tường minh khi cần làm rõ ý định
- Tránh sử dụng
Anytrừ khi thực sự cần thiết - Sử dụng nullable types (
?) khi giá trị có thể null - Chuyển đổi kiểu tường minh thay vì dựa vào auto-casting
📝 Tóm tắt
- Kotlin là ngôn ngữ statically typed với type inference
- Các kiểu số:
Byte,Short,Int,Long,Float,Double - Kiểu cơ bản khác:
Boolean,Char,String - Null Safety: Thêm
?để cho phép null - Sử dụng
isđể kiểm tra kiểu và smart casting - Chuyển đổi kiểu tường minh với
toXxx()