使用takeWhile函数时非常奇怪。
valnumbers =intArrayOf(20,10,30)命名了一个Array数组
使用takeWhile选出数组中大于10的元素。
println("takeWhile:${numbers.takeWhile{ it>10}}")
结果:[20]
是的结果只有20,那还有30去哪了?于是我看了下源码:
public inline funIntArray.takeWhile(predicate: (Int) -> Boolean): List {
val list = ArrayList()
for(item in this) {
if(!predicate(item))
break
list.add(item)
}
return list
}
大致意思是:循环遍历每个元素代入判断函数(predicate),不符合的直接break出循环。
什么???excute me??break出循环,难怪没有30.因为循环到元素10的时候不符合判断条件所以break出了循环。
于是乎,我复制源码,自己改了下扩展函数。
public inline fun IntArray.takeWhile2(predicate: (Int) -> Boolean): List {
val list = ArrayList()
for(item in this) {
if(!predicate(item))
continue
list.add(item)
}
returnlist
}
把break改成continue即可。
总结:takeWhile是挺方便都不用自己写循环了,但切记,这仅适用于有序列表。不然会数据丢失,出现不可告人的py啊!!