Bỏ qua để đến nội dung

🔢 Giá trị và Kiểu dữ liệu

🎯 Mục tiêu: Hiểu các kiểu dữ liệu cơ bản trong Kotlin, cách Kotlin tự suy luận kiểu, và sự khác biệt với ngôn ngữ khác.


Mọi giá trị trong Kotlin đều có kiểu dữ liệu (data type). Kotlin là ngôn ngữ statically typed - kiểu được xác định tại compile-time, nhưng bạn không cần khai báo nhờ type inference.

val name = "Bumbii" // Kotlin tự hiểu đây là String
val age = 25 // Kotlin tự hiểu đây là Int
val pi = 3.14 // Kotlin tự hiểu đây là Double
val active = true // Kotlin tự hiểu đây là Boolean

Kiểu Kích thước Phạm vi
Byte 8 bits -128 đến 127
Short 16 bits -32,768 đến 32,767
Int 32 bits -2³¹ đến 2³¹-1 (~±2.1 tỷ)
Long 64 bits -2⁶³ đến 2⁶³-1
val byte: Byte = 127
val short: Short = 32000
val int = 1000000 // Mặc định là Int
val long = 10000000000L // Thêm 'L' cho Long
Kiểu Kích thước Độ chính xác
Float 32 bits ~6-7 chữ số thập phân
Double 64 bits ~15-16 chữ số thập phân
val float = 3.14f // Thêm 'f' cho Float
val double = 3.14159265359 // Mặc định là Double
val char: Char = 'K' // Một ký tự, dùng dấu nháy đơn
val string: String = "Kotlin" // Chuỗi, dùng dấu nháy kép
val isActive = true
val hasPermission = false

Kotlin tự động suy luận kiểu dữ liệu:

// Không cần khai báo kiểu
val message = "Hello" // String
val count = 42 // Int
val price = 99.99 // Double
val items = listOf(1, 2, 3) // List<Int>
// Khai báo tường minh khi cần
val amount: Long = 100 // Cần Long, không phải Int
val rate: Float = 0.5f // Cần Float, không phải Double

val oneMillion = 1_000_000 // Dễ đọc hơn 1000000
val creditCardNumber = 1234_5678_9012_3456L
val socialSecurityNumber = 999_99_9999L
val hexBytes = 0xFF_EC_DE_5E
val bytes = 0b11010010_01101001_10010100_10010010
val decimal = 42 // Thập phân
val hexadecimal = 0x2A // Thập lục phân (= 42)
val binary = 0b101010 // Nhị phân (= 42)

⚠️ Điểm khác biệt quan trọng với Java

Phần tiêu đề “⚠️ Điểm khác biệt quan trọng với Java”
val intValue: Int = 100
// ❌ Lỗi trong Kotlin
// val longValue: Long = intValue
// ✅ Phải convert tường minh
val longValue: Long = intValue.toLong()

Trong Kotlin, không có primitive types như Java. Mọi thứ đều là object:

val number = 42
println(number.toString()) // OK! Int có methods
println(number.plus(8)) // 50
println(number.coerceIn(0, 40)) // 40 (giới hạn trong khoảng)
val nonNull: Int = 42 // Không thể null
val nullable: Int? = null // Có thể null
// Sẽ học chi tiết ở bài Null Safety

Kotlin yêu cầu chuyển đổi tường minh:

val intValue = 100
val longValue = intValue.toLong()
val doubleValue = intValue.toDouble()
val stringValue = intValue.toString()
// Các method chuyển đổi
val byte: Byte = intValue.toByte()
val short: Short = intValue.toShort()
val float: Float = intValue.toFloat()
val char: Char = intValue.toChar()
val strNumber = "42"
val number = strNumber.toInt() // 42
val safeNumber = strNumber.toIntOrNull() // 42 hoặc null
val invalidStr = "abc"
// val error = invalidStr.toInt() // ❌ NumberFormatException!
val safe = invalidStr.toIntOrNull() // null (an toàn)

val anything: Any = "Hello"
val alsoAnything: Any = 42
fun printAnything(value: Any) {
println(value)
}
fun printMessage(): Unit {
println("Hello")
}
// Có thể bỏ qua Unit
fun printMessage() {
println("Hello")
}
fun fail(message: String): Nothing {
throw IllegalStateException(message)
}

Bài tập 1: Xác định kiểu dữ liệu

fun main() {
val a = 42 // Kiểu gì?
val b = 42L // Kiểu gì?
val c = 3.14 // Kiểu gì?
val d = 3.14f // Kiểu gì?
val e = 'K' // Kiểu gì?
val f = "Kotlin" // Kiểu gì?
val g = true // Kiểu gì?
val h = listOf(1, 2) // Kiểu gì?
}

Đáp án:

  • aInt
  • bLong
  • cDouble
  • dFloat
  • eChar
  • fString
  • gBoolean
  • hList<Int>

Bài tập 2: Chuyển đổi kiểu

fun main() {
val userInput = "25"
// TODO: Chuyển thành Int và tính tuổi sau 5 năm
// TODO: Xử lý trường hợp input không hợp lệ
}

Lời giải:

fun main() {
val userInput = "25"
val age = userInput.toIntOrNull()
if (age != null) {
val futureAge = age + 5
println("Sau 5 năm bạn sẽ $futureAge tuổi")
} else {
println("Tuổi không hợp lệ")
}
}

// Parse data từ Intent extras
val userId = intent.getIntExtra("USER_ID", -1)
val userName = intent.getStringExtra("USER_NAME") ?: "Unknown"
// Parse từ SharedPreferences
val settings = getSharedPreferences("settings", MODE_PRIVATE)
val notificationEnabled = settings.getBoolean("notifications", true)
val lastSync = settings.getLong("last_sync", 0L)

Kotlin còn có:

Kiểu Mô tả Sẽ học ở
Array<T> Mảng Bài Collections
List<T> Danh sách Bài Collections
Map<K,V> Từ điển Bài Collections
Data class Class chứa data Bài OOP
Enum class Tập hợp hằng số Bài OOP
Sealed class Class đóng Bài OOP

Sau bài học này, bạn có thể:

  • Liệt kê 8 kiểu dữ liệu cơ bản trong Kotlin
  • Hiểu cách Kotlin tự suy luận kiểu (type inference)
  • Phân biệt Int vs Long, Float vs Double
  • Sử dụng underscore trong số lớn (1_000_000)
  • Chuyển đổi kiểu với toInt(), toLong(), toString(), etc.
  • Sử dụng toIntOrNull() để parse an toàn

Tiếp theo: Kiểu dữ liệu Số