这是扩展功能:
fun <T, R> Collection<T>.fold(initial: R, combine: (acc: R, nextElement: T) -> R): R {
var accumulator: R = initial
for (element: T in this) {
accumulator = combine(accumulator, element)
}
return accumulator
}
是否可以用单独的函数替换第二个参数,它是一个函数。例如,看起来像这样的东西:
fun <T, R> Collection<T>.fold(initial: R, someFun)
fun someFun (acc: R, nextElement: T) -> R): R {
var accumulator: R = initial
for (element: T in this) {
accumulator = combine(accumulator, element)
}
return accumulator
}
答案 0 :(得分:2)
您可以使用两个冒号来传递对该函数的引用:
var collection = listOf<String>()
collection.fold(3, ::someFun)
fun <T, R> someFun(acc: R, nextElement: T): R {
var accumulator: R = acc
// ...
return accumulator
}
答案 1 :(得分:0)
我不确定您为什么需要以这种方式提取函数。有问题的所需代码无法编译,并且需要一个可行的替代方案才能知道您的实际意图。
例如,如果您不想使用参数类型来拼写长函数签名,则可能是因为您有很多采用该类型函数参数的此类函数,而又害怕在该签名中犯错误,您可以将函数类型声明提取到type alias中:
typealias Combiner<R, T> = (acc: R, nextElement: T) -> R
,然后在函数声明中使用该类型别名:
fun <T, R> Collection<T>.fold(initial: R, combine: Combiner<R, T>): R {
var accumulator: R = initial
for (element: T in this) {
accumulator = combine(accumulator, element)
}
return accumulator
}