Tìm hiểu về scope function trong Kotlin

I, Scope function

  • Kotlin standard library cung cấp Scope function với mục đích duy nhất là xử lý 1 đoạn code trong context của object.
  • Scope function lấy tham số là 1 function của 1 object. Khi sử dụng, chúng ta có thể:
    • 1, thay thế function đó bằng cách truyền vào lambada expression.
    • 2, truy cập vào object của function mà không cần định nghĩa name cho nó.
  • Kotlin cung cấp cho 5 loại scope function là let, run, with, applyalso.

II, Phân biệt

  • Các loại scope function khác nhau ở 2 điểm:
    • 1, Object reference trong lambada function: this (lambada receiver) hay it (lambada argument).
    • 2, Giá trị trả về: context object hay lambada result.
  • Bảng phân biệt các scope function:
Scope function Object reference Return value is extension function ?
apply this context object Yes
also it context object Yes
let it lambada result Yes
run this lambada result Yes
run No this or it lambada result No: called without the context object.
with this lambada result No: take context object as an argument
  • Ví dụ 1: sử dụng apply, alsolet
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// `apply` use `this` as object reference
val applyPerson: Person = Person("Adam").apply {
age = 32
}

// `also` use `it` as object reference
val alsoPerson: Person = Person("Adam").also {
it.age = 32
}

// `let` use `it` as object reference
val letPerson = Person("Adam")
val age: Int = letPerson.let {
it.age = 32
it.age // return value is last expression
}
  • Ví dụ 2: sử dụng run (run có 2 version)
1
2
3
4
5
6
7
8
9
10
11
12
13
// `run` version 1: use `this` as object reference
val runPerson = Person("Adam", 32)
val age: Int = runPerson.run {
age // return value is last expression
}
println("Age is $age") // result: Age is 32

// `run` version 2: called without object reference. It doesn't have `this` or `it`
val text = run {
val str = "It life"
str
}
println(text) // result: str
  • Ví dụ 3: sử dụng with
1
2
3
4
5
val numbers = mutableListOf("one", "two", "three")
val firstAndLast = with(numbers) {
"First: ${first()}," + " Last: ${last()}"
}
println(firstAndLast) // result: First: one, Last: three
  • Chú ý: Mặc dù, scope function làm cho code ngắn gọn hơn trong hầu hết trường hợp nhưng chúng có thể làm cho code khó đọc và dẫn tới error.
    Do đó chúng ta nên tránh lồng các scope function vâo với nhau và cần thận khi nối chúng với nhau.