如何让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
相关产品推荐
相关产品推荐

