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
}