在 Kotlin 中继续运行块

Posted

技术标签:

【中文标题】在 Kotlin 中继续运行块【英文标题】:Continue in a run block in Kotlin 【发布时间】:2018-07-17 04:58:06 【问题描述】:

我正在尝试以惯用的方式将以下 Java 代码转换为 Kotlin:

for (Group group : groups) 
    String groupName = group.getName();
    if (groupName == null) 
        warn("Group name is null for group " + group.getId());
        continue;
    
    ...

我尝试了以下

for (group in groups) 
    val groupName = group.name ?: run 
        warn("Group name is null for group $group.id!")
        continue
    
    ...

但是这不会编译错误:

'break' 或 'continue' 跳过函数或类边界

所以我的问题是,有没有更好的方法在 Kotlin 中编写这个?

【问题讨论】:

【参考方案1】:

通常continue 也可以通过::filter 模拟。

但由于在这种情况下您还需要一个警告,这使得经典的for 成为最佳解决方案。

但是有一些替代方案。

groups.filter  group -> when(group.name) 
        null -> 
            warn("Group name is null for group $group.id!")
            false
        
        else -> true
    .for Each 
        ...
    

或使用return@forEach

但同样,在这种情况下,经典的for 是最好的解决方案

【讨论】:

【参考方案2】:

不用过多修改你的代码,直接使用旧的if

for (group in groups) 
    val groupName = group.name

    if (groupName == null) 
        warn("Group name is null for group $group.id!")
        continue
    
    ...

【讨论】:

【参考方案3】:

同样的java代码可以这样实现。

for (group in groups) 
    val groupName = group.name
    if(groupName == nul)
      warn("Group name is null for group $group.id!")
      continue
    
    ...

但是,您可以通过提供标签继续顶部循环或 Kotlin 中的其他循环。

loop@ for (i in 1..100) 
    for (j in 1..100) 
        if (...) continue@loop
    

更新:

您不能在 lambda 函数中实现 continue。但您也可以使用return

fun foo() 
    listOf(1, 2, 3, 4, 5).forEach lit@
        if (it == 3) return@lit // local return to the caller of the lambda, i.e. the forEach loop
        print(it)
    
    print(" done with explicit label")

输出:

1245 done with explicit label

参考: https://kotlinlang.org/docs/reference/returns.html

【讨论】:

【参考方案4】:

我想我找到了一个非常令人满意且惯用的解决方案:

groups.forEach  group ->
    val groupName = group.name ?: run 
        warn("Group name is null for group $group.id!")
        return@forEach
    
    ...

【讨论】:

以上是关于在 Kotlin 中继续运行块的主要内容,如果未能解决你的问题,请参考以下文章

错误记录Kotlin 代码运行时报错 ( 在 init 初始化块中调用还未初始化的成员属性 )

如何在 Kotlin 中同时运行阻塞 Java 代码?

在 kotlin 循环中继续 n 次

在 Kotlin 中的功能循环中,如何“中断”或“继续”?

Kotlin init 小记

Kotlin init 小记