Kotlin中按条件持续处理集合的代码优化问询
优化方案解析
咱们先聊聊原代码的问题:每次循环先调用col.any { predicate(it) }遍历一遍集合检查是否存在符合条件的元素,紧接着又调用col.find { predicate(it) }再遍历一遍找目标元素——这相当于每次循环至少要遍历两次集合,在集合元素较多的时候,这种重复遍历会浪费不少性能。
下面是几种更简洁高效的优化实现,核心思路都是把「检查存在+查找元素+执行转换」合并成一次遍历操作,避免重复扫描集合:
方案1:可读性优先的do-while写法
do { val member = col.find { predicate(it) }?.also { transform(it) } } while (member != null)
- 用
find直接定位第一个符合条件的元素,找到后通过also立即执行transform操作 - do-while结构保证至少执行一次检查,只要
member不为空(也就是找到并处理了元素)就继续循环,逻辑清晰直观
方案2:紧凑的do-while简化版
do { } while (col.find { predicate(it) }?.also { transform(it) } != null)
- 把查找+转换的逻辑直接放进while条件里,do块留空,代码更紧凑,核心逻辑和方案1完全一致
方案3:直接用while循环的极简写法
while (col.find { predicate(it) }?.also { transform(it) } != null) {}
- 省略do块,直接在while条件中完成所有逻辑:每次判断时先执行find+transform,返回非空就继续循环
- 这种写法最简洁,而且因为题目保证算法会终止,不会出现无限循环的问题
这些优化后的写法不仅减少了集合遍历次数、提升了性能,同时代码更简洁易读,还消除了原代码中!!可能带来的空指针潜在风险(原代码里find返回null时!!会抛出异常,虽然后续any已经做了判断,但优化写法从根源上规避了这个问题)。
内容的提问来源于stack exchange,提问作者David Soroko
相关产品推荐
相关产品推荐

