Kotlin中遍历全部元素后判断是否存在真值的正确方法
解决方案
首先澄清一个误解:你当前的代码其实已经会遍历所有元素并执行doSomething。因为map对普通Iterable(比如IntRange)是立即执行的,会先把范围内的每个元素都传入doSomething,生成完整的Boolean列表后,再调用any()检查是否存在true。只要你没有使用惰性序列(asSequence()),这种写法就不会提前终止遍历。
如果想更简洁、避免生成中间列表的函数式写法,可以用fold来累积结果:
fun shiftRows(numberOfRows: Int, xRange: IntProgression): Boolean { println("shifting row") return (1..numberOfRows).fold(false) { acc, idx -> acc || doSomething(idx, -1) } }
fold的逻辑很直接:
- 初始累积值
acc设为false - 遍历范围内的每个元素,依次执行
doSomething - 每次用
acc || doSomething的返回值更新累积值(只要有一次返回true,后续的acc就会保持true) - 遍历完所有元素后,返回最终的累积值,就是你要的“是否有子函数返回true”的结果
这种写法既保证了所有元素都被处理,又符合函数式风格,还避免了额外的列表开销。
内容的提问来源于stack exchange,提问作者pbuchheit
相关产品推荐
相关产品推荐

