在 Kotlin 中检查真值而不退出循环的正确方法

问题描述 投票:0回答:1

我正在 Kotlin 中开发一个应用程序,该应用程序需要迭代一个范围,为每个项目调用一个子函数。然后该函数返回一个布尔值,指示是否有任何子函数调用返回 true。我遇到的问题是子函数修改了数据的状态。如果我使用“any()”,一旦其中一个子函数调用返回 true,它将退出循环。我想在确定结果 id 是 true 还是 false 之前循环遍历范围内的所有项目。我知道我可以通过简单地将所有子函数结果存储在一个单独的变量中来做到这一点,但我觉得应该有一种更实用的惯用方法来做到这一点。是否有类似于“any()”的东西可以在返回之前检查所有项目?

作为参考,这是我的代码的简化示例:

var values = mutableListOf(1,2,3)
fun shiftRows(numberOfRows:Int, xRange: IntProgression):Boolean {
    println("shifting row")
    val v1:Boolean = (1..numberOfRows).map { idx -> doSomething( idx, -1  )}.any()
    return v1
}

fun doSomething(index:Int, currentValue:Int):Boolean
{
    //do some row shifting here
    values[index] = currentValue
    return index > 4
}

shiftRows(4, 1..4)
kotlin lambda functional-programming iteration range
1个回答
0
投票

我们可以使用 fold():

val v1:Boolean = (1..numberOfRows).fold(false) { acc, idx -> acc or doSomething( idx, -1  ) }

它并不像简单的

any { }
那么干净,但即使说英语,“any”也意味着我们不关心所有项目,而只关心我们得到的第一个项目。

© www.soinside.com 2019 - 2024. All rights reserved.