kotlin - 减少/折叠中的两个累加器

标签 kotlin functional-programming

假设我有一个数据列表 val data = listOf("F 1", "D 2", "U 1", "D 3", "F 10") 我想执行每个元素的给定逻辑。

我必须在外部添加 var acc2 = 0 才能执行此操作。我想知道是否有可能将两个累加器折叠/减少,从而使该方法没有副作用。

val data = listOf("F 1", "D 2", "U 1", "D 3", "F 10")
var acc2 = 0
val result = data.fold(0, { acc, str ->
    when (str.split(" ")[0]) {
        "F" -> {
            acc + str.split(" ")[1].toInt() * acc2
        }
        "D" -> {
            acc2 += str.split(" ")[1].toInt()
            acc
        }
        "U" -> {
            acc2 -= str.split(" ")[1].toInt()
            acc
        }
        else -> {
            acc
        }
    }
})

最佳答案

您可以使用一个简单的对象来包装这两个值。

data class Position(var horizontal: Int, var depth: Int)

val data = listOf("F 1", "D 2", "U 1", "D 3", "F 10")

val result = data.fold(Position(0, 0)) { position, str ->
    val (command, value) = str.split(" ")

    when (command) {
        "F" -> position.horizontal += value.toInt()
        "D" -> position.depth += value.toInt()
        "U" -> position.depth -= value.toInt()
    }

    position
}

如果您不想为此创建新类,您可以使用类 Pair<Int, Int>来自 Kotlin 的 stdlib。

关于kotlin - 减少/折叠中的两个累加器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70197300/

相关文章:

Kotlin:带有 this 关键字的辅助构造函数

android - 是否可以从任何地方通过语音命令触发您的应用程序?

haskell - 程序程序员的功能代码片段列表?

functional-programming - 我如何证明 Coq 中的两个 Fibonacci 实现相等?

java - 将使用字节的 java 函数转换为 Kotlin

Android 7 中的 Androidx 导航图标兼容性问题

functional-programming - ocaml编译过程的逻辑

functional-programming - 使用 Lazy.jl 在 Julia 中生成惰性范围

Javascript:如何用更实用的模式替换嵌套的 if/else?

sql - 如何使用 Kotlin 的暴露 ORM 获得具有正确行为的createdAt和lastModified字段?