Max*_*xim 7 functional-programming kotlin
我正在查看数组扩展函数,发现了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
}
Run Code Online (Sandbox Code Playgroud)
这里的accumulator类型变量S分配有类型数组中的第一个元素T。
我无法理解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) }
Run Code Online (Sandbox Code Playgroud)
似乎大多数具有此功能的现实生活用例都使用此签名:
inline fun <T> Array<out T>.reduce(operation: (acc: T, T) -> T): T
Run Code Online (Sandbox Code Playgroud)
您能否帮忙提供一些示例,其中reduce()函数对于不同类型很有用。
这是一个例子:
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)
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7841 次 |
| 最近记录: |