You need to enable JavaScript to run this app. 如何高效在Kotlin集合中检测指定关键词是否存在
优惠活动
大模型
产品
解决方案
定价
更多

如何高效在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.17 23:45:10