Kotlin中使用不同类型的reduce()函数

7

我正在查看数组扩展函数,发现了reduce()函数。

inline fun <S, T: S> Array<out T>.reduce(operation: (acc: S, T) -> S): S {
    if (isEmpty())
        throw UnsupportedOperationException("Empty array can't be reduced.")
    var accumulator: S = this[0]
    for (index in 1..lastIndex) {
        accumulator = operation(accumulator, this[index])
    }
    return accumulator
}

这里将类型为T的数组中的第一个元素赋值给类型为Saccumulator变量。

我无法理解使用两种数据类型的reduce()函数的实际用例。这是一个人工示例,实际上没有任何意义。

open class A(var width: Int = 0)
class B(width: Int) : A(width)

val array = arrayOf(A(7), A(4), A(1), A(4), A(3))
val res = array.reduce { acc, s -> B(acc.width + s.width) }

似乎大多数真实生活使用场景都使用这个函数签名:

inline fun <T> Array<out T>.reduce(operation: (acc: T, T) -> T): T

您能为我提供一些使用reduce()函数的不同类型的示例吗?

1个回答

3

这里有个例子:

interface Expr {
    val value: Int
}

class Single(override val value: Int): Expr

class Sum(val a: Expr, val b: Expr): Expr {
    override val value: Int
        get() = a.value + b.value
}

fun main(args: Array<String>) {
    val arr = arrayOf(Single(1), Single(2), Single(3));
    val result = arr.reduce<Expr, Single> { a, b -> Sum(a, b) }
    println(result.value)
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接