标签是一个非常好用的东西。他可以让我们在多循环嵌套的情况下,进行穿插处理。不会像java一样,continue,break只能针对当前循环。那么让我们来体验下标签吧。
- 标签介绍:
在 Kotlin 中任何表达式都可以用标签(label)来标记。 标签的格式为标识符后跟 @ 符号,例如:abc@、fooBar@都是有效的标签。 要为一个表达式加标签,我们只要在其前加标签即可。
-例子1 外面一个while循环、里面一个for循环 ,语句表现postTask @ 在for循环,那么break@postTask 退出的循环就是for
fun checkAndUploadUnFinishPublish(emqxManager: EmqxManager) {
val publishTaskDao = db.publishTaskDao()
GlobalScope.launch(dbExecutor) {
checkAndDeleteData()
var unFinishedTask = publishTaskDao.getUnFinishedTaskSuspend(1)
Log.i(TAG, "unFinishedTask[${unFinishedTask.size}]")
while (unFinishedTask.isNotEmpty() && emqxManager.isConnected && isActive) {
postTask@for (publishTask in unFinishedTask) {
val result = runBlocking {
return@runBlocking withContext(Dispatchers.Main) {
val success = emqxManager.publishmessageplusFromDb(publishTask)
Log.i(TAG, "rePublish[${success}]: ${AppUtil.gson.toJson(unFinishedTask)}")
if (success){
publishTask.isDone = true
publishTaskDao.updateSuspend(publishTask)
}
return@withContext success
}
}
if (!result){
break@postTask //推出for循环
}
}
delay(200)
unFinishedTask = publishTaskDao.getUnFinishedTaskSuspend(1)
}
}
}
例子2
fun labelDemo(){
val intArr = intArrayOf(0,1,2)
val intArr2 = intArrayOf(0,1,2)
Log.i(TAG,"start for")
intArrFor@for (int in intArr){ //第一个for循环
Log.i(TAG,"for intArr int : $int")
intArr2For@for (int2 in intArr2){ //第2个for循环
// 每一次退出,回到intArrFor
if(int2 == 1) break@intArrFor //退出第一个for循环
Log.i(TAG,"for intArr2 int2 : $int2")
}
}
Log.i(TAG,"end for")
}
网友评论