Kotlin中String.getOrElse()与elementAtOrElse()等方法有什么区别?
Kotlin String相关索引取值方法差异解答
功能维度结论:两组方法表现完全一致
String.getOrElse()和String.elementAtOrElse(),以及getOrNull()和elementAtOrNull()针对String类型调用时,所有场景的返回结果没有任何区别:
- 两类方法都会先判断传入索引是否在
[0, 字符串长度-1]的合法区间内 - 索引合法时返回对应位置的Char字符
- 索引越界时,
*OrElse系列执行传入的默认值lambda返回结果,*OrNull系列直接返回null
你可以自行测试索引为负、索引等于字符串长度、索引超出最大范围、正常取值等所有边界场景,返回结果完全匹配。
性能维度结论:无实际可感知的差异
针对String场景两类方法的性能开销几乎一致:
- 两者的时间复杂度都是O(1),仅需要一次索引合法性判断,合法就直接访问字符串底层char数组的对应位置
- 唯一可以忽略的微小差异是,
elementAtOrElse/elementAtOrNull是Iterable的通用扩展方法,调用时多了一次「当前对象是否支持随机访问」的分支判断,这个判断的开销在纳秒级,循环调用百万次的耗时差都可以忽略,完全不会影响业务性能。
唯一区别是设计定位不同
两类方法的核心差异是适用场景的设计定位:
- 如果你明确当前操作的是String、数组、List这类支持随机索引访问的结构,直接用
getOrElse/getOrNull可读性更高,更符合对应类型的使用习惯 - 如果你写的是通用工具函数,需要兼容所有Iterable类型(比如同时适配List、Sequence、Set等),就用
elementAtOrElse/elementAtOrNull,不用额外做类型分支判断就能保证所有入参类型正常调用。
内容的提问来源于stack exchange,提问作者Markus Weninger
相关产品推荐
相关产品推荐

