运行list.all()
或list.any()
个函数时,Kotlin是否计算列表中的所有对象.例如:
val myList = listOf(1, 8, 11, 13, 15)
val allOdd = myList.all { it % 2 == 1 }
Kotlin会判断第二元素及以后的元素吗?
显然,这在本例中没有太大区别,但给出一个要计算的函数列表,这可能会产生重大影响.
运行list.all()
或list.any()
个函数时,Kotlin是否计算列表中的所有对象.例如:
val myList = listOf(1, 8, 11, 13, 15)
val allOdd = myList.all { it % 2 == 1 }
Kotlin会判断第二元素及以后的元素吗?
显然,这在本例中没有太大区别,但给出一个要计算的函数列表,这可能会产生重大影响.
以all
的source code为基础,一旦找到列表中与谓词不匹配的元素,它将立即返回,并且不继续计算其余元素:
public inline fun <T> Iterable<T>.all(predicate: (T) -> Boolean): Boolean {
if (this is Collection && isEmpty()) return true
for (element in this) if (!predicate(element)) return false
return true
}
与any类似的情况.
这可以使用以下代码进行测试:
var evaluatedLastItem = false
val list = listOf(
{ true },
{ false },
{
evaluatedLastItem = true
false
}
)
val allTrue = list.all { it() == true }
println("allTrue = $allTrue")
println("evaluatedLastItem = $evaluatedLastItem")
输出:
allTrue = false
evaluatedLastItem = false