继续在科特林进行跑步

时间:2018-07-17 04:58:07

标签: java loops kotlin continue

我正在尝试以惯用的方式将以下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编写此代码?

4 个答案:

答案 0 :(得分:1)

可以像这样实现相同的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

答案 1 :(得分: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 :(得分:0)

无需过多修改代码,只需使用旧的if

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

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

答案 3 :(得分:0)

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

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