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!")