kotlin的ForEach函数整活

5,902 阅读1分钟

forEach现状

kotlin借助自身的特性将for循环变成了函数,这极大的方便了一些场景,但是forEarch函数却是有个缺陷。

forEach函数的缺陷

arrayListOf(1,2,3).forEach { 
    println(it) //输出:1,2,3
}

这是forEach函数,但是他存在一个缺陷(和for循环相比),那我们来看看相同的for循环:

val array = arrayListOf(1,2,3)
for (value in array) {
    println(value)
}

可能有些人会觉得,这不是很正常吗,功能完美体现,有什么缺陷呢?

forEach缺少了continue和brack

这就是目前我觉得的forEach函数的缺陷

实现continue和break

都知道continue和break都可以对for循环进行中断,想到中断于是我就想到了异常(exception)!!于是乎:

object ForEach {
    val `continue`: Unit get() = throw ContinueException //创建continue自定义异常
    val `break`: Unit get() = throw BreakException

    object ContinueException : RuntimeException()
    object BreakException : RuntimeException()
}

第二步就是重新实现forEach函数:

inline fun <T> Iterable<T>.forEachPro(action: ForEach.(T) -> Unit): Unit {
    val foreach = ForEach
    for (element in this) {
        try {
            foreach.action(element)
        } catch (ex: ForEach.ContinueException) {
            continue //执行continue
        } catch (ex: ForEach.BreakException) {
            break //执行break
        }
    }
}

由于原本的forEach函数是全局的,所以自定义的函数改一下名称:forEachPro
完成。

使用

arrayListOf(1,2,3).forEachPro {
    if (it == 2) {
        `continue`
    }
    println(it)//输出:1,3
}