高阶函数
如果一个函数接收另一个函数作为参数,或者返回值的类型是另一个函数,那么该函数就称为高阶函数。
定义函数类型
(type1, type2, type3, ...) -> returnType
左边括号里面的是函数接收的参数类型, 右边是返回值类型,如果没有参数那么用()
,没有返回值用Unit
fun example(func : (String, String) -> Boolean) {
func("hello", "halo")
}
fun operateString(str1: String, str2: String, operation: (String, String) -> Boolean): Boolean {
return operation(str1, str2)
}
fun compare(str1: String, str2: String): Boolean {
return str1 > str2
}
fun test() {
operateString("hello", "halo", ::compare)
}
高阶函数主要是结合Lambda表达式
Lambda表达式: {参数名1: 参数类型, 参数名2: 参数类型 -> 函数体}
最后一行代码会自动作为Lambda表达式的返回值。
operateString("hello", "halo") {str1, str2 -> str1 > str2}
传递上下文
当需要连续调用同一个对象的多个方法时,apply
函数可以让代码变得更加精简。使用高阶函数实现
fun StringBuilder.build(block : StringBuilder.() -> Unit): StringBuilder {
block()
//StringBuilder类定义了一个扩展函数Build是一个高阶函数,接收一个函数参数。返回值也是StringBuilder
//函数类型参数的声明方式是className.(),表示这个函数类型是定义在这个类中的。当我们调用build
//函数时传入的Lambda表达式将会自动拥有对应类的上下文
return this
}
StringBuilder().build {
append("ppp")
append("kkk")
}
使用泛型
inline fun <T> T.build(block: T.() -> Unit) : T {
block()
return this
}
val str: String = ""
str.build {
}