何为高阶函数
函数参数为函数的,称为高阶函数。
高阶函数的定义
fun lock<T>(lock: Lock, body: () -> T ) : T {
lock.lock()
try {
return body()
}
finally {
lock.unlock()
}
}
lock
函数的第二个参数是一个函数,该函数无参,返回T类型。
调用该函数
fun toBeSynchroized() = sharedResource.operation()
val result = lock(lock, ::toBeSynchroized)
val result = lock(lock, {
sharedResource.operation() })
第一个调用传递的是一个标准定义的函数,第二个是一个字面函数(一会会介绍什么是字面函数)。
针对第二个调用,我们正常能看到的方式应该是:
lock (lock) {
sharedResource.operation()
}
因为Kotlin
有一个约定,就是如果第二个参数是函数,可以放到括号外面,所以格式从lock(lock,{function})
变成了lock(lock){function}
举第二个栗子
map函数
fun <T, R> List<T>.map(transform: (T) -> R):
List<R> {
val result = arrayListOf<R>()
for (item in this)
result.add(transform(item))
return result
}
正常调用形式应该是map(funtion)
,但是由于最后一个参数是参数,所以一般见到的形式是map{funtion}
:
val doubled = ints.map {it -> it * 2}
其中{it->it*2}
是一个字面函数,关于字面函数也有一个神话(约定)就是如果参数只有一个(这里只有it),该参数也可以省略。
ints.map {it * 2}
字面函数
无声明函数,匿名函数。这两个词能概括么?字面函数就是一种函数表达式。
函数类型
fun max<T>(collection: Collection<out T>, less: (T, T) -> Boolean): T? {
var max: T? = null
for (it in collection)
if (max == null || less(max!!, it))
max = it
return max
}
max
函数的第二个参数是一个函数,参数名less
。(T,T)->Boolean
就是该函数的类型,表示该函数有两个参数,返回的是布尔值。
闭包
var sum = 0
ins filter {it > 0} forEach {
sum += it
}
print(sum)