美文网首页
Kotlin forEach中实现break

Kotlin forEach中实现break

作者: 笨鱼天阳 | 来源:发表于2022-04-22 21:03 被阅读0次

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

    本文:https://blog.csdn.net/CrazyApes/article/details/124349273

    @[toc]

    前言

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

    相关文章

      网友评论

          本文标题:Kotlin forEach中实现break

          本文链接:https://www.haomeiwen.com/subject/yshcsrtx.html