【问题标题】:How to write multiple conditions in Kotlin for loop如何在 Kotlin for 循环中编写多个条件
【发布时间】:2019-01-12 12:17:39
【问题描述】:

这是我的以下代码

val idNumber: String = "1342342"
var randomNumber = 0

for (number in idNumber) {
    if (randomNumber < 20) {
        // Do something
        randomNumber++
    }
}

这里我有一个 for 循环,它遍历 idNumber,同时我必须检查 randomNumber 是否小于 20

在Java中,我可以这样写

for (int i = 0 ; i < idNumber.length() && randomNumber < 20 ; i++) {

}

我如何在 Kotlin 中做同样的事情?

我通过 Stackoverflow 解决了这个问题,发现了这个 solution,它解释了使用更实用的方法。请为我上面提到的问题提出一个好的解决方案。

编辑 1:我知道 while 循环可用于执行逻辑与,但我想知道解决此问题的功能方法是什么

编辑 2:添加了答案,但仍然希望听到可以更好地了解此问题的人的意见

【问题讨论】:

  • 我认为您当前的解决方案很好; Kotlin 的 for 循环本质上是不同的,并且无法模拟某些 Java 构造。此外,短代码不一定比(主观上)更易理解的代码更好。
  • 链接答案使用范围(0..5),我没有范围。我最近开始使用 Kotlin,但我不确定我是否做得对。所以我想从其他更精通 Kotlin 的开发人员那里获得更好的视角。
  • 你可以简单地使用字符串本身(字符串和范围都是可迭代的)。
  • @Moira 我认为应该这样做。

标签: loops kotlin


【解决方案1】:

似乎在这种情况下,randomNumber 真的只是一个计数器。如果是这种情况,您可以通过使用take() 来执行此操作,而无需维护randomNumber 的状态:

idNumber.take(20).forEach { number ->
    ...
}

它的作用是遍历idNumber 字符串中的每个Char,但最多只有20 个。如果您要将这些转换为其他内容,您可能需要考虑使用 map 而不是 forEach,后者只有副作用并且不会返回任何内容。

【讨论】:

    【解决方案2】:

    解决办法很简单

    idNumber.takeWhile { randomNumber < 20 }.forEach { number ->
    
    }
    

    正如 @pixix4 在评论中指出的那样,上述解决方案不适用于非序列,因此对 randomNumber 的任何更改都不会反映到 takeWhile 块,因为 takeWhile 块已执行首先和之后 forEach 块被执行。

    添加asSequence() 解决了我认为的问题。 @Todd 提供的解决方案正是我想要的。

    【讨论】:

    • 这仅适用于序列。如果您按原样运行它,它将执行完整的 takeWhile 块,然后执行 forEach 块。因此,对 randomNumber 的更改不会反映到 takeWhile 块。您需要在 takeWhile 调用之前添加asSequence()
    • 完全明白你在说什么。更新了答案。
    猜你喜欢
    • 2017-12-27
    • 1970-01-01
    • 2014-09-20
    • 2017-08-13
    • 1970-01-01
    • 2021-04-17
    • 1970-01-01
    • 2017-03-13
    相关资源
    最近更新 更多