12/08/2018, 15:55

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.

0