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

I, Scope function

  • Recommend: trước khi đọc bài này, mình khuyên các bạn đọc về high-order function trước.
  • Kotlin cung cấp scope function với mục đích là xử lý code trong context của object.
  • Scope function có parameter có kiểu dữ liệu là function type. Chúng ta thường khởi tạo nó bằng lambada expression.
  • Scope function không phải là kiến thức mới mà nó được tạo ra để code ngắn gọn và đễ đọc hơn.
  • Chú ý: Scope function 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 nhau và cẩn thận khi nối chúng.

II, Phân biệt

  • Kotlin cung cấp cho 5 loại scope function là let, run, with, applyalso.
  • Các loại scope function khác nhau ở 2 điểm chính:
    • Object reference: this (lambada receiver) hoặc it (lambada argument).
    • Return type: context object hoặc 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