Tự học ngôn ngữ lập trình Kotlin - phần 1 - Kiểu dữ liệu cơ sở
Như mọi người đã biết, Kotlin hiện tại đã được xác nhận chính thức từ Google, và bắt đầu từ Android Studio 3.0, công cụ hỗ trợ Kotlin sẽ được tích hợp trực tiếp vào Android Studio(tham khảo bài viết về kotlin từ google tại đây: https://developer.android.com/kotlin/index.html . Dưới đây là bài viết ...
Như mọi người đã biết, Kotlin hiện tại đã được xác nhận chính thức từ Google, và bắt đầu từ Android Studio 3.0, công cụ hỗ trợ Kotlin sẽ được tích hợp trực tiếp vào Android Studio(tham khảo bài viết về kotlin từ google tại đây: https://developer.android.com/kotlin/index.html . Dưới đây là bài viết hướng dẫn tự học ngôn ngữ lập trình Kotlin để viết ứng dụng dành cho Android.
1. Kiểu cơ sở
Trong Kotlin, tất cả mọi thứ là một object, ta có thể gọi các member function hoặc các properties trên bất kỳ biến nào, trong phần này, chúng ta sẽ học về các kiểu cơ sở được dùng trong Kotlin: numbers, characters, booleans, arrays, và strings.
a) Numbers
Kotlin xử lý numbers theo cách gần giống với java nhưng không hoàn toàn giống. Ví dụ, sẽ không có chuyển đổi mở rộng tìm ẩn cho số, và cú pháp sẽ hơi khác trong một số trường hợp. Kotlin cung cáp các kiểu xây dựng sẵng dành cho numbers nhu sau:
Type | Bit Width |
---|---|
Double | 64 |
Float | 32 |
Long | 64 |
Int | 32 |
Short | 16 |
Byte | 8 |
b) Literal Constants
Có các kiểu hắng dành cho số nguyên như sau:
- Decimals: 123
- Kiểu Long được thêm chữ L ở cuối: 123L
- Hexadecimals: 0x0F
- Binaries: 0b00001011
- Octal literals: Không được hỗ trợ
c) Underscores trong kiểu số
Ta sử dụng dấu gạch dưới trong kiểu số để dễ đọc hơn. Ví dụ:
val oneMillion = 1_000_000` val creditCardNumber = 1234_5678_9012_3456L
d) Explicit Conversions
Một giá trị ở kiểu nhỏ hơn chẳng hạn như int KHÔNG thể ngầm được chuyển đổi sang kiểu lớn hơn chẳng hạn như long.
val b: Byte = 1 // OK, literals are checked statically val i: Int = b // ERROR Chúng ta phải khai báo chuyển đổi kiểu Explicit val i: Int = b.toInt() // OK: explicitly widened
Các chuyển đổi kiểu được Kotlin hỗ trợ:
toByte(): Byte toShort(): Short toInt(): Int toLong(): Long toFloat(): Float toDouble(): Double toChar(): Char
e) Operations
Tương tự như java, ngoài ra Kotlin còn hỗ trợ một số thao tác bitwise (chỉ trong Int và Long):
shl(bits) – signed shift left (Java's <<) shr(bits) – signed shift right (Java's >>) ushr(bits) – unsigned shift right (Java's >>>) and(bits) – bitwise and or(bits) – bitwise or xor(bits) – bitwise xor inv() – bitwise inversion
f) Characters
Characters được trình bày trong kotlin bằng kiểu char. Chúng không thể sử dụng trực tiếp với số.
fun check(c: Char) { if (c == 1) { // ERROR: incompatible types // ... } }
Các kí tự đi kèm với dấu nháy đơn: '1'. Để escape các ký tự đặc biệt thì dùng dấu . Các escape sau được hỗ trợ: , , , , ', ", and $ Chúng ta có thể explicit convert một kí tự sáng kiểu số int:
fun decimalDigitValue(c: Char): Int { if (c !in '0'..'9') throw IllegalArgumentException("Out of range") return c.toInt() - '0'.toInt() // Explicit conversions to numbers }
g) Booleans
Kiểu Boolean có 2 giá trị true, false
|| – lazy disjunction && – lazy conjunction ! - negation
h) Arrays
Arrays trong Kotlin được mô tả bởi class Array, nó có hai hàm get và set (trả về [ ]) và thuộc tính size
class Array<T> private constructor() { val size: Int operator fun get(index: Int): T operator fun set(index: Int, value: T): Unit operator fun iterator(): Iterator<T> // ... }
Để tạo array, chúng ta có thể dùng thư viện arrayof() và đặt giá trị vào trong tham số. Ví dụ: arrayOf(1, 2, 3) sẽ tạo ra một mảng [1, 2, 3]. Ngoài ra, có thể dùng arrayOfNulls() để tạo một mảng chứa các phần tử rỗng.
// Creates an Array<String> with values ["0", "1", "4", "9", "16"] val asc = Array(5, { i -> (i * i).toString() })
Không giống như java, arrays trong Kotlin là không đổi. Nghĩa là Kotlin không cho phép chúng ta gán Array<String> to an Array<Any>, nó sẽ ngăn ngừa các failure có thể xảy ra trong thời gian runtime. Kotlin ngoài ra có các class đặc biệt của mảng kiểu cơ sở như: ByteArray, ShortArray, IntArray
val x: IntArray = intArrayOf(1, 2, 3) x[0] = x[1] + x[2]
k) Strings
Chuỗi có thể chứa các template expressions, ví dụ: nối chuỗi với giá trị của một biến. Một template expressions bắt đầu bằng ($$ và đi sau là một tên.
val i = 10 val s = "i = $i" // evaluates to "i = 10"
val s = "abc" val str = "$s.length is ${s.length}" // evaluates to "abc.length is 3"
Template expressions ngoài ra còn hỗ trợ cả chuỗi thô(raw) hoặc chứa các escaped strings. Nếu muốn hỗ trợ ký tự ($$ trong chuỗi thô(không hỗ trợ dấu escaped), ta có thể sử dụng cú pháp sau:
val price = """ ${'$'}9.99 """
2. Packages
Một file source có thể bắt đầu bằng khai báo package:
package foo.bar fun baz() {} class Goo {} // ...
Tất cả nội dung trong file source được chứa trong khai báo packages. Nên, ở ví dụ trên: tên đầy đủ của baz() là foo.bar.baz, và tên đầy đủ của Goo là foo.bar.Goo
a) Các Default Imports
Một số package sẽ được import vào Kotlin file mặc định:
kotlin.* kotlin.annotation.* kotlin.collections.* kotlin.comparisons.* (since 1.1) kotlin.io.* kotlin.ranges.* kotlin.sequences.* kotlin.text.*
Các package sẽ được thêm phụ thuộc vào nền tảng đích:
VM: java.lang.* kotlin.jvm.* JS: kotlin.js.*
b) Imports
Mỗi file có thể chứa các import của riêng nó.
import foo.Bar // Bar bây giờ có thể được dùng mà không cần tên đầy đủ foo.Bar import foo.* // mọi thứ trong foo sẽ có thể được dùng
Không giống như java, Kotlin không có cú pháp import static riêng lẻ. Tất cả các khai báo đều sử dụng import
Nếu khai báo ở đầu file là private thì file đó sẽ private trong khai báo import.