在扩展函数中替换 lamda

Replace lamda in an extension function

这是一个扩展函数:

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
}

您可以使用两个冒号来传递对函数的引用:

var collection = listOf<String>()
collection.fold(3, ::someFun)

fun <T, R> someFun(acc: R, nextElement: T): R {
    var accumulator: R = acc
    // ...
    return accumulator
}

我不确定您为什么需要以这种方式提取函数。有问题的所需代码无法编译并提出可行的替代方案,需要了解您的实际意图。

例如,如果您不想在参数类型中拼写一个长函数签名,可能是因为您有很多这样的函数采用该类型的函数参数并且您害怕在其中犯错误签名,您可以将功能类型声明提取到 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
}