Kotlin higher order function
Last modified: 16 February 2024Higher-Order function là function có thể nhận một function như một param hoặc có thể trả về một function:
fun doSomethingWithNumber(number: Int, receiver: (String?) -> Unit) {
var result: String? = null
//...do complex work with number
receiver(result)
}
Function doSomethingWithNumber()
có 2 param là number
kiểu Int
và receiver
là một function (String?) -> Unit
với String
là kiểu của tham số truyền vào và Unit
(Void
) là kiểu trả về của hàm. Ta có thể gọi doSomethingWithNumber()
bằng những cách sau:
Function References:
doSomethingWithNumber(1000, ::processWithResult)
fun processWithResult(result: String?) : Unit {
// do something with result
}
Lúc này sau khi mà function doSomethingWithNumber()
gọi receiver(result)
, sẽ nhảy vào function processWithResult()
với result
được truyền từ function doSomethingWithNumber()
, điều này giống với callback
trong Java
hay các ngôn ngữ khác. Thay vì ta truyền interface
thì ở đây ta truyền reference
của function vào bằng cách sử dụng toán tử ::
và tên function.
Nói thêm một chút về Function References
. Toán tử ::
có thể sử dụng với các overload function ví dụ như:
fun isOdd(x: Int) = x % 2 != 0
fun isOdd(s: String) = s == "brillig" || s == "slithy" || s == "tove"
val numbers = listOf(1, 2, 3)
println(numbers.filter(::isOdd)) // refers to isOdd(x: Int)
Function Anonymous
doSomethingWithNumber(1000, fun(result: String?) {
// do something with result
})
Thay vì truyền reference của function vào, ta định nghĩa luôn function ở argument. Function Anonymous khá giống với với các function thông thường, chỉ khác một điều là tên của function bị bỏ qua.