如何高效在Kotlin集合中检测指定关键词是否存在
优化方案
Kotlin 标准库提供了短路遍历函数 any(),只要找到第一个符合匹配条件的元素就会立刻停止遍历返回true,不会遍历整个集合,也不会生成额外的中间集合,比filter + 判断size的写法效率高很多,尤其适合大集合场景。
另外你原代码存在两处问题:City类是自定义数据类,无法直接调用contains方法,需要访问其name属性做匹配;原返回值Loation.GERMANY存在拼写错误,应为Location.GERMANY。
最简优化代码
fun getLocation(): Location? { val listCities = listOf<City>(/* 城市列表初始化逻辑 */) // 匹配欧洲关键词,匹配到立刻返回 if (listCities.any { it.name.contains("Madrid") }) { return Location.EUROPE } // 未匹配到欧洲,再匹配德国关键词 if (listCities.any { it.name.contains("Hamburg") }) { return Location.GERMANY } // 无匹配场景可根据业务需求返回默认值/抛出异常 return null }
可扩展优化方案
如果后续需要新增更多大洲/国家的匹配规则,可以把规则按优先级存入列表,避免写大量重复的if判断:
fun getLocation(): Location? { val listCities = listOf<City>(/* 城市列表初始化逻辑 */) // 按匹配优先级排列规则,优先级越高越靠前 val matchRules = listOf( { city: City -> city.name.contains("Madrid") } to Location.EUROPE, { city: City -> city.name.contains("Hamburg") } to Location.GERMANY // 新增规则只需在此处添加即可 ) matchRules.forEach { (matchCondition, returnLocation) -> if (listCities.any(matchCondition)) return returnLocation } return null }
效率对比
- 原有
filter + size写法:需要遍历整个集合生成匹配元素的新集合,再读取集合长度,存在O(n)的时间复杂度+额外的集合内存开销。 any()写法:短路遍历,最好情况下第一个元素就匹配直接返回,最坏情况才遍历整个集合,无额外内存开销,性能提升明显。
内容的提问来源于stack exchange,提问作者Arsene Raul
相关产品推荐
相关产品推荐

