在Kotlin中,我不能在函数循环和我的lambda中做 break
或 continue
- 就像我可以从正常的 for
循环中做的那样 . 例如,这不起作用:
(1..5).forEach {
continue@forEach // not allowed, nor break@forEach
}
有old documentation提到这个可用,但它似乎从未实现过 . 当我想在lambda中使用 continue
或 break
时,获得相同行为的最佳方法是什么?
Note: 这个问题是由作者故意撰写和回答的(Self-Answered Questions),因此对于常见的Kotlin主题的惯用答案存在于SO中 . 还要澄清为Kotlin的alphas写的一些非常古老的答案,这些答案对于当前的Kotlin来说是不准确的 .
4 回答
除了您要求提供类似功能之外,还有其他选项 . 例如:
您可以使用filter避免处理某些值:(如
continue
)您可以使用takeWhile来停止功能循环:(如
break
)一个更复杂的,虽然荒谬的例子,你想要做一些处理,跳过一些结果值,然后停在一组不同的条件,将是:
这些功能的组合往往不需要
continue
或break
. 这里有无穷无尽的不同选择,而且可以记录下来 . 为了了解可以做什么,最好是学习Kotlin标准库中可用的所有函数collections,lazy sequences和iterable .有时候有些情况下你需要变异状态仍然需要
break
或continue
并且在功能模型中很难做到 . 您可以使用更复杂的函数(如fold
和reduce
)与filter
和takeWhile
函数结合使其工作,但有时候更难以理解 . 因此,如果您真的想要这种确切的行为,您可以使用return from lambda expression,它根据您的使用情况模仿continue
或break
.这是一个模仿
continue
的示例:当您遇到嵌套或混乱的情况时,您可以更复杂并使用标签:
如果你想做一个
break
,你需要一些你可以返回的循环之外的东西,这里我们将使用run()
函数来帮助我们:而不是
run()
它可能是let()
或apply()
或任何你自然围绕forEach
的东西,这是一个你想要打破的地方 . 但是你也会在_1258489之后跳过同一个区块内的代码,所以要小心 .这些是内联函数,所以实际上它们并没有真正增加开销 .
阅读所有特殊情况(包括匿名函数)的Returns and Jumps的Kotlin参考文档 .
Here is a unit test 证明这一切都有效:
takeWhile可以使用stdlib函数代替break .
例如,
forEach
with break可以特别用any function代替:或者甚至可能更短:
如果需要使用
continue
或break
,那么使用forEach
比较正常for-loop
是不理想的如果你真的想链接你的命令,并像for循环那样执行,那么使用正常的功能链,而不是
forLoop
例如 . 对于
使用
map
作为循环,filterNot
作为继续,使用asSequence() & first
作为休息