Kotlin减少了对多个元素进行操作的方法

时间:2018-03-08 12:21:55

标签: 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)
}

1 个答案:

答案 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()

如果您在演出之后,由于创建的中间列表较少,步骤较少会更好。另一方面,如果你在演出之后,你应该使用延迟序列开始,然后每个步骤的价格要低得多。