Kỹ thuật lập trình trong Kotlin

Câu lệnh rỗng

Trong ngôn ngữ Kotlin, các câu lệnh trống có thể được biểu diễn bằng:

  • {}
  • Unit
when (x) {
    1 -> ...
    2 -> ...
    else -> {}
    // else -> Unit
}

Biểu thức when

Sử dụng biểu thức when không có điều kiện để thay thế các khối phân nhánh

val v = if (x < y) 1 else if (x == y) 2 else 3

val v = when {
    x < y -> 1
    x == y -> 2
    else -> 3
}

Sử dụng biểu thức when có điều kiện để mô phỏng khớp mẫu

val v = if (x == 1) 1 else if (x == 2) 3 else 5

val v = when (x) {
    1 -> 1
    2 -> 3
    else -> 5
}

Toán tử ?. và ?:

// n nhận giá trị đầu tiên không phải null trong a, b, c, 4
val n = a ?: b ?: c ?: 4

a b c n
1 / / 1
null 2 / 2
null null 3 3
null null null 4
// n nhận giá trị a.b.c nếu a, a.b, a.b.c đều không phải null. Ngược lại n nhận giá trị 4.
val n = a?.b?.c ?: 4

a a.b a.b.c n
null / / 4
!= null null / 4
!= null != null null 4
!= null != null 3 3

Sử dụng khai báo giải cấu trúc để tạo hai biến có giá trị

var (a, b) = listOf(1, 2) // a == 1, b == 2
var (a, b) = Pair(1, 2) // a == 1, b == 2
var (a, b) = 1 to 2 // a == 1, b == 2

Hàm let

Giới thiệu ngắn gọn về các hàm let, apply, also, with và run trong Kotlin

// Gọi hàm [block] với `this` làm đối số và trả về kết quả
public inline fun <T, R> T.let(block: (T) -> R): R = block(this)

Thực thi khối mã, trong đó this là đối số của khối, trả về kết quả của khối.

// sử dụng 'let' để chuyển đổi từ kiểu này sang kiểu khác
val answerToUniverse = strBuilder.let {
    it.append("Douglas Adams was right after all")
    it.append("Life, the Universe and Everything")
    42
}
// sử dụng 'let' để chỉ in khi str không phải null
str?.let { print(it) }

Hàm apply

// Gọi hàm [block] với `this` như là người nhận và trả về `this`
public inline fun <T> T.apply(block: T.() -> Unit): T { block(); return this }

Thực thi khối mã, trong đó this là người nhận, trả về chính this.

// Cách cũ xây dựng một đối tượng
val andre = Person()
andre.name = "andre"
andre.company = "Viacom"
andre.hobby = "losing in ping pong"
// sau khi áp dụng 'apply'
val andre = Person().apply {
    name = "Andre"
    company = "Viacom"
    hobby = "losing in ping pong"
}

Hàm also

// Gọi hàm [block] với `this` làm đối số và trả về `this`
public inline fun <T> T.also(block: (T) -> Unit): T { block(this); return this }

Thực thi khối mã, trong đó this là đối số, trả về this.

// xử lý dữ liệu từ API với biến trung gian
val rawData = api.getData()
Log.debug(rawData)
rawData.map {  /** other stuff */  }
// sử dụng 'also' để duy trì chuỗi phương thức
api.getData()
    .also { Log.debug(it) }
    .map { /** other stuff */ }

Hàm with

// Gọi hàm [block] với [receiver] làm người nhận và trả về kết quả
public inline fun <T, R> with(receiver: T, block: T.() -> R): R = receiver.block()

Thực thi khối mã, trong đó người nhận được chỉ định, trả về kết quả của khối.

// Mọi lập trình viên Android sau ngày 17 tháng 5 năm 2017
    messageBoard.init(" https://url.com ")
    messageBoard.login(token)
    messageBoard.post("Kotlin’s a way of life bro")

// dùng 'with' để tránh lặp lại tham chiếu đến tên biến
with(messageBoard) {
    init(" https://url.com ")
    login(token)
    post("Kotlin’s a way of life bro")
}

Hàm run

// Gọi hàm [block] với `this` làm người nhận và trả về kết quả
public inline fun <T, R> T.run(block: T.() -> R): R = block()

Thực thi khối mã, trong đó this là người nhận, trả về kết quả của khối.

// Các nhà phát triển GoT sau mùa 7
aegonTargaryen = jonSnow.run {
    makeKingOfTheNorth()
    swearsFealtyTo(daenerysTargaryen)
    realIdentityRevealed("Aegon Targaryen")
}

So sánh let, apply, also, with và run

Hàm let apply also with run
this là người nhận
this là tham số
Trả về this
Trả về kết quả của khối

takeIf / takeUnless

Khác biệt giữa also, apply, let, use, takeIf và takeUnless trong Kotlin

// Trả về giá trị nếu thỏa mãn điều kiện, ngược lại trả về null
inline fun <T> T.takeIf(predicate: (T) -> Boolean): T? = if (predicate(this)) this else null
// Trả về giá trị nếu không thỏa mãn điều kiện, ngược lại trả về null
inline fun <T> T.takeUnless(predicate: (T) -> Boolean): T? = if (!predicate(this)) this else null

takeIf: Nếu this thỏa mãn điều kiện thì trả về this, ngược lại trả về null. takeUnless: Nếu this không thỏa mãn điều kiện thì trả về this, ngược lại trả về null.

println(myVar.takeIf { it is Person } ?: "Not a person!")
println(myVar.takeUnless { it is Person } ?: "It's a person!")

Thẻ: Kotlin Programming null safety functional programming extension functions

Đăng vào ngày 25 tháng 6 lúc 05:06