You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让Kotlin when字符串比较默认不区分大小写以简化重复代码?

让Kotlin的when表达式支持不区分大小写的字符串匹配

当然可以优化你现在这种重复调用toLowerCase()的写法!Kotlin的when本身没有内置默认的不区分大小写字符串比较,但我们可以通过几种简洁的方式来实现,彻底消除重复代码。

方案1:预处理枚举的小写形式

既然你用到了枚举,我们可以提前把枚举值的小写形式缓存起来,避免每次重复调用toLowerCase():

首先修改你的枚举类(如果有权限的话):

enum class RTC_SUBTYPE {
    sdp, bye, negotiationOffer;

    // 提前生成小写形式,仅初始化一次
    val lowerCaseValue = this.toString().toLowerCase()
}

然后你的when表达式就可以简化成:

when (subtype.toLowerCase()) {
    MessagingClient.RTC_SUBTYPE.sdp.lowerCaseValue -> onSDPMessageReceived(topic, sender, data!!)
    MessagingClient.RTC_SUBTYPE.bye.lowerCaseValue -> onRTCBYEMessageReceived(topic, sender)
    MessagingClient.RTC_SUBTYPE.negotiationOffer.lowerCaseValue -> onNegotiationOfferMessageReceived(sender, data!!)
}

这种方式既减少了重复代码,也因为提前缓存了枚举的小写值,稍微提升了性能。

方案2:自定义infix函数实现简洁匹配

如果不想修改枚举,我们可以写一个简单的扩展函数,让字符串比较变得更直观:

// 定义一个infix函数,支持不区分大小写的比较
infix fun String.equalsIgnoreCase(other: String) = this.equals(other, ignoreCase = true)

然后when就可以写成无subject的形式,代码更清爽:

when {
    subtype equalsIgnoreCase MessagingClient.RTC_SUBTYPE.sdp.toString() -> onSDPMessageReceived(topic, sender, data!!)
    subtype equalsIgnoreCase MessagingClient.RTC_SUBTYPE.bye.toString() -> onRTCBYEMessageReceived(topic, sender)
    subtype equalsIgnoreCase MessagingClient.RTC_SUBTYPE.negotiationOffer.toString() -> onNegotiationOfferMessageReceived(sender, data!!)
}

这种方式不需要修改任何现有类,直接通过扩展函数实现语法糖,可读性很高。

方案3:把匹配逻辑封装到枚举中(推荐)

更符合面向对象思想的方式是把匹配逻辑直接封装到枚举类里,以后如果要修改匹配规则(比如改成区分大小写),只需要修改枚举内部的方法即可:

enum class RTC_SUBTYPE {
    sdp, bye, negotiationOffer;

    // 封装不区分大小写的匹配逻辑
    fun matches(input: String) = input.equals(this.toString(), ignoreCase = true)
}

然后when表达式就变成了:

when {
    MessagingClient.RTC_SUBTYPE.sdp.matches(subtype) -> onSDPMessageReceived(topic, sender, data!!)
    MessagingClient.RTC_SUBTYPE.bye.matches(subtype) -> onRTCBYEMessageReceived(topic, sender)
    MessagingClient.RTC_SUBTYPE.negotiationOffer.matches(subtype) -> onNegotiationOfferMessageReceived(sender, data!!)
}

这种方式把匹配逻辑和枚举值绑定在一起,代码职责更清晰,也方便后续维护。


内容的提问来源于stack exchange,提问作者Pitel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:20:47