Jan*_*nar 0 functional-programming kotlin
我有一个数字列表.我想要进行以下操作:1*2 + 3*4.但是,reduce操作一次只能使用一个元素.在我的情况下,我需要一次使用两个元素.是否可以使用reduce或使用任何其他方法?
package com.zetcode
fun main(args: Array<String>) {
val nums = listOf(1, 2, 3, 4)
val res = nums.reduce { total, next -> total * next }
println(res)
}
Run Code Online (Sandbox Code Playgroud)
您需要list.chunked(2)将列表转换为两个成员列表的列表,然后fold而不是reduce生成结果(因为结果的类型不再与列表项的类型相同):
val nums = listOf(1, 2, 3, 4)
val res = nums
.chunked(2)
.fold(0) { total, next -> total + next[0] * next[1] }
println(res)
Run Code Online (Sandbox Code Playgroud)
它主要是风格选择,但我更喜欢避免重量级fold功能,而是将计算分解为更小的步骤,如下所示:
val res = nums
.chunked(2)
.map { it.reduce(Int::times) }
.sum()
Run Code Online (Sandbox Code Playgroud)
如果您在演出之后,由于创建的中间列表较少,步骤较少会更好.另一方面,如果你在演出之后,你应该使用延迟序列开始,然后每一步的价格要低得多.
| 归档时间: |
|
| 查看次数: |
452 次 |
| 最近记录: |