Loops 如何在Kotlin for循环中写入多个条件

Loops 如何在Kotlin for循环中写入多个条件,loops,kotlin,Loops,Kotlin,这是我拥有的以下代码 val idNumber: String = "1342342" var randomNumber = 0 for (number in idNumber) { if (randomNumber < 20) { // Do something randomNumber++ } } val-idNumber:String=“1342342” var随机数=0 for(idNumber中的数字){ 如果(随机数

这是我拥有的以下代码

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

for (number in idNumber) {
    if (randomNumber < 20) {
        // Do something
        randomNumber++
    }
}
val-idNumber:String=“1342342”
var随机数=0
for(idNumber中的数字){
如果(随机数<20){
//做点什么
随机数++
}
}
这里我有一个for循环,它遍历idNumber,同时我必须检查randomNumber是否小于20

在Java中,我可以这样写

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

}
for(int i=0;i
在科特林我该怎么做

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

编辑1:我知道while循环可以用来执行逻辑and,但我想知道解决这个问题的函数方法是什么

编辑2:添加了答案,但仍然希望听到能够更好地了解此问题的人的回答

解决方案很简单

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

}
idNumber.takeWhile{randomNumber<20}.forEach{number->
}
正如@pixix4在注释中指出的,上述解决方案不适用于非序列,因此对randomNumber的任何更改都不会反映到takeWhile块,因为takeWhile块是先执行的,然后再执行forEach块


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

在这种情况下,
randomNumber
实际上只是一个计数器。如果是这种情况,您可以使用
take()
,不必保持
randomNumber
的状态:


这样做的目的是迭代
idNumber
字符串中的每个
Char
,但最多只能迭代20个字符。如果你把这些变成了其他的东西,你可能想考虑<代码> MAP>代码>而不是<代码>前缀,它只具有副作用,不返回任何东西。

我认为你当前的解决方案是好的;Kotlin的
for
循环本质上是不同的,一些Java构造无法被模拟。此外,短代码并不一定比(主观上)更容易理解的代码好。链接答案使用范围(0..5),我的例子中没有范围。我最近开始使用Kotlin,我不确定我是否做得对。因此,我想从其他更精通Kotlin的开发人员那里得到一个更好的视角。你可以简单地使用字符串本身(字符串和范围都是可编辑的)。@Moira我认为应该这样做。这只适用于序列。如果按原样运行,它将执行完整的takeWhile块,然后执行forEach块。因此,对randomNumber的更改不会反映到takeWhile块中。您需要在takeWhile调用之前添加
asSequence()
。完全理解您的意思。更新了答案。
idNumber.take(20).forEach { number ->
    ...
}