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