我有一个数字列表。我想进行以下操作: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)
}
答案 0 :(得分:5)
您需要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)
这主要是风格选择,但我更喜欢避免使用重量级fold
函数,而是将计算分解为更小的步骤,如下所示:
val res = nums
.chunked(2)
.map { it.reduce(Int::times) }
.sum()
如果您在演出之后,由于创建的中间列表较少,步骤较少会更好。另一方面,如果你在演出之后,你应该使用延迟序列开始,然后每个步骤的价格要低得多。