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

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)

Mar*_*nik 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)
Run Code Online (Sandbox Code Playgroud)

它主要是风格选择,但我更喜欢避免重量级fold功能,而是将计算分解为更小的步骤,如下所示:

val res = nums
        .chunked(2)
        .map { it.reduce(Int::times) }
        .sum()
Run Code Online (Sandbox Code Playgroud)

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