Kotlin forEach中实现break
2022-04-22 本文已影响0人
笨鱼天阳
Kotlin
线上编写练习
Kotlin官网提供了 PlayGround 供大家线上尝试
地址:https://play.kotlinlang.org/
本文:https://blog.csdn.net/CrazyApes/article/details/124349273
@[toc]
前言
切换为 Kotlin 后很多函数使用还不太习惯。
最近就遇到了如何在forEach
中使用break
的问题。
解决方式
老规矩,先说解决方式,如果确定就是要在forEach
类似函数中使用的话。
- 可以考虑在外层包裹一层
lambda
然后使用return@
返回标签操作。
例如下:
我使用run
函数包裹,通过return@run
得到我想要得结果,并终止遍历。
fun main(){
val result = (1..6).run {
forEach {
if (it > 3) {
println("forEach -> $it > 3 , can break")
return@run "num $it"
}
println("forEach -> $it")
}
}
println("out -> $result")
}
// 运行结果如下
forEach -> 1
forEach -> 2
forEach -> 3
forEach -> 4 > 3 , can break
out -> num 4
遇到得问题
因为在使用forEach
得时候下意识得使用得匿名标签得返回。
fun main(){
var result = ""
(1..6).forEach {
if (it > 3) {
println("forEach -> $it > 3 , can break")
result = "num $it"
return@forEach
}
println("forEach -> $it")
}
println("out -> $result")
}
// 运行结果
forEach -> 1
forEach -> 2
forEach -> 3
forEach -> 4 > 3 , can break
forEach -> 5 > 3 , can break
forEach -> 6 > 3 , can break
out -> num 6
显然,我期望是能得到num 4
这个结果,但是运行结果显然return@forEach
并没有中止循环,看上去更像是continue
类似的操作。
咱们参考下源码一看便知。
/**
* Performs the given [action] on each element.
*/
@kotlin.internal.HidesMembers
public inline fun <T> Iterable<T>.forEach(action: (T) -> Unit): Unit {
for (element in this) action(element)
}
很明显,我们return
的只是action。并不会影响for
循环的运行。
所以可以在外层再做一次嵌套,保证可以通过标签return
到自己想要的位置,达到中止循环的目的。
如果不用forEach
的话,还是可以使用for
循环中正常的break
,continue
等操作,在for
循环中也可以通过显示标签控制返回的位置。
结语
Kotlin 有很多非常合适的高阶函数,我这边确实需要遍历集合根据一些条件做其它操作。如果只是获取集合中的一些信息,可以考虑使用集合的一些高阶操作。而不必使用遍历的方式,显得不够优雅。
参考文献
Break and continue labels
Break and continue labels (Kotlin中文网)