Lập trình Kotlin — Các kiểu dữ liệu
Trong ngôn ngữ Kotlin, tất cả là đối tượng (object) và chúng có thể được dùng trong hàm, hoặc thuộc tính của những lớp, hoặc đối tượng khác. Và chúng có cách xuất hiện trong chương trình với những kiểu khác nhau như số (numbers), chuỗi (string), kí tự (char),… Trong bài này chúng ta sẽ tìm hiểu về các kiểu dữ liệu cơ bản của ngôn ngữ lập trình Kotlin.
Số — Numbers
Kotlin cung cấp các loại số khác nhau.
Số nguyên (Int): Có 4 loại số nguyên trong Kotlin
Các kiểu dữ liệu muốn dùng ko được khai báo lớn hơn giá trí lớn nhất của loại dữ liệu bạn muốn dùng. Muốn chỉ kiểu dữ liệu loại gì thì bạn phải chỉ rõ lúc khai báo và một số trường hợp thì Kotlin ngầm hiểu. Với kiểu Long thì bạn chỉ cần thêm chữ L thì Kotlin tự hiểu kiểu dữ liệu là Long
val one = 1 // Int
val fourBillion = 4000000000 // Long
val fiveLong = 5L // Long
val oneByte: Byte = 1
Kiểu số dấu phẩy động (floating-point numbers): Có 2 loại số thập phân trong Kotlin là Float và Double. Theo chuẩn IEEE 754 thì phần thập phân lớn nhất có thể thể lưu trữ.
Kiểu
Số được khai báo thập phần thì Kotlin ngầm hiểu là kiểu double, do đó để chỉ rõ kiểu float thì bạn phải thêm f ở chuối phần khai báo.
val pi = 3.14 // Double
val e = 2.7182818284 // Double
val eFloat = 2.7182818284f // Float, actual value is 2.7182817
Chú ý: Kotlin không tự động chuyển đổi kiểu ví dụ bạn có hàm sau:
fun add(a: Int, b: Int) = a + b
fun main() {
val a = 4.5
val b = 4
println(add(a, b)) // error: type mismatch
}
Ghi hằng số
Đối với số nguyên thì Kotlin hỗ trợ
- Số thập phân
- Số thập lục phân
- Số nhi phân
Chú ý: Số bát phân không hỗ trợ trong Kotlin
Gạch dưới trong Kotlin (từ 1.1)
Với gạch dưới giúp cho hằng số của bạn dễ đọc hơn
val oneMillion = 1_000_000
val creditCardNumber = 1234_5678_9012_3456L
val socialSecurityNumber = 999_99_9999L
val hexBytes = 0xFF_EC_DE_5E
val bytes = 0b11010010_01101001_10010100_10010010
Đại diện
Tường minh trong chuyển đổi
Loại dữ liệu nhỏ không là con của dữ liệu lớn.
// Hypothetical code, does not actually compile:
val a: Int? = 1 // A boxed Int (java.lang.Integer)
val b: Long? = a // implicit conversion yields a boxed Long (java.lang.Long)
print(b == a) // Surprise! This prints “false” as Long’s equals() checks whether the other is Long as well
Do vậy dữ liệu nhỏ không thể tự động chuyển sang dữ liệu lớn hơn.
val b: Byte = 1 // OK, literals are checked statically
val i: Int = b // ERROR
Chúng ta có thể dùng các hàm sau để chuyển sang dữ liệu mong muốn.
- toByte(): Byte
- toShort(): Short
- toInt(): Int
- toLong(): Long
- toFloat(): Float
- toDouble(): Double
- toChar(): Char
Ngâm chuyển đổi chỉ xảy ra ở một số toán hạng
val l = 4L + 1 // Long + Int => Long
Toán hạng
Kotlin hỗ trợ các phép + — * /
Phép chia số nguyên -> nguyên
- Phần dư sẽ bị lược bỏ
val x = 5 / 2
//println(x == 2.5) // ERROR: Operator ‘==’ cannot be applied to ‘Int’ and ‘Double’
println(x == 2)
val x = 5L / 2
println(x == 2L)
- Chỉ trả về kiểu dấu phẩy động nếu tham số đã chuyển sang kiểu dấu phẩy động
val x = 5 / 2.toDouble()
println(x == 2.5)
Toán hạng Bitwise
Hỗ trợ Long và Int
val x = (1 shl 2) and 0x000FF000
Danh sách các toán hạng Bitwise
- shl(bits) — dịch trái số có dấu
- shr(bits) — dịch phải số có dấu
- ushr(bits) — phải số ko dấu
- and(bits) — bitwise and
- or(bits) — bitwise or
- xor(bits) — bitwise xor
- inv() — bitwise inversion
So sánh giữa các số dấu phẩy động
- Kiểm tra bằng a == b, and a != b
- So sánh toán hạng: a < b, a > b, a <= b, a >= b
- Dãy và kiểm tra dãy: a..b, x in a..b, x !in a..b
Kiểu ký tự
Đại diện cho ký tự, nó không ngầm hiểu là số, và để viết nó thì phải đặt trong dấu nháy đơn.
fun decimalDigitValue(c: Char): Int {
if (c !in ‘0’..’9')
throw IllegalArgumentException(“Out of range”)
return c.toInt() — ‘0’.toInt() // Explicit conversions to number
}
Chuyển sang kiểu Int bằng cách gọi toInt
Boolean
đại diện cho booleans và có 2 giá trị true và false. Các toán hạng ||, && và !
val b = true
println(!b) // false
Arrays
Trong Kotlin, Arrays đại diện bằng Array class.
Tạo array:
arrayOf() hoặc arrayOfNulls()
Ví dụ: arrayOf(1, 2, 3) tạo 1 [1, 2, 3]
Tạo array với array size và 1 hàm trả về giá trị
val asc = Array(4) { i -> (i * i).toString() }
Kotlin là không đổi do đó ko thể ép kiểu Array<String> sang Array<Any>
Kiểu Array cơ bản: ByteArray, ShortArray, IntArray chúng không kế thừa từ Array nhưng có hàm cơ bản giống nhau
Ngoài ra trong Kotlin còn hỗ trợ số nguyên không dấu UByte, BShort, UInt, ULong kích thước giống như kiểu có dấu. Và cũng hỗ trợ 1 số kiểu dãy không dấu tương ứng UByteArray, UShortArray, UIntArray, và ULongArray.
Để ghi số không dấu chúng ta thường có phần đuôi với chữ u.
val b: UByte = 1u // UByte, expected type provided
val s: UShort = 1u // UShort, expected type provided
val l: ULong = 1u // ULong, expected type provided
val a1 = 42u // UInt: no expected type provided, constant fits in UInt
val a2 = 0xFFFF_FFFF_FFFFu // ULong: no expected type provided, constant doesn’t fit in UInt
Chuỗi.
Được đại diện bởi String, và không thay đổi. Các phần tử của String là char và có thể diệt String bởi vòng lập foor-loop:
for (c in str) {
println(c)
}
Cách viết String
val s = “Hello Viet Android \n”
String có thể hiển thị nhiều dòng bằng cách đặt trong 3 dấu nháy kép
val text = “””
Bạn đang học bài
các kiểu dữ liệu cơ
“””
Bỏ phần đầu trắng là | bằng trimMargin()
val text = “””
|Tell me and I forget.
|Teach me and I remember.
|Involve me and I learn.
|(Benjamin Franklin)
“””.trimMargin()
Có thể cụ thể trimMargin kí tự khác.
Định dạng hay trình bày string có thể xem lại video Kotlin cơ bản phần 6.