Kotlin forEach中实现break

Kotlin
线上编写练习
Kotlin官网提供了 PlayGround 供大家线上尝试
地址:https://play.kotlinlang.org/

前言

切换为 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中文网)

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值