Lập trình Kotlin — Các kiểu dữ liệu

Liem Vo
Viet Android Developers
5 min readAug 5, 2020

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.

--

--