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