在扩展功能中替换lamda

时间:2018-12-20 14:52:03

标签: kotlin

这是扩展功能:

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
}

2 个答案:

答案 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
}