Scala单遍处理含分隔符字符串序列的高效安全方案需求
Scala 字符串序列单遍处理方案
给定如下字符串序列:
val words = Seq("1 $ cake", "2biscuit", "3brownie", "4 $ honey")
需求是生成结果序列:若字符串包含$,则取其前面的部分并去除首尾空格;否则保留原字符串,期望结果为:
val res = Seq("1", "2biscuit", "3brownie", "4")
最优单遍处理方案
使用Scala原生字符串操作结合集合map方法,实现单遍、安全且高效的处理:
val words = Seq("1 $ cake", "2biscuit", "3brownie", "4 $ honey") val res = words.map { s => val dollarIndex = s.indexOf('$') if (dollarIndex != -1) s.substring(0, dollarIndex).trim else s }
方案说明
- 单遍处理:
indexOf会从字符串开头扫描到第一个$就停止,后续的substring和trim都基于找到的索引直接操作,没有重复遍历字符串。 - 安全性:当字符串中不存在
$时,indexOf返回-1,此时直接返回原字符串,不会出现数组越界或空指针问题;即使$位于字符串开头,substring(0, 0)得到空字符串,trim后仍为空,逻辑符合预期。 - 高效性:原生字符串操作是JVM层面优化过的方法,相比正则表达式匹配,避免了正则编译和复杂匹配逻辑的开销,性能更优。
备选方案(正则方式)
如果追求代码简洁性,也可以使用正则表达式,但性能略低于原生索引操作:
val dollarPattern = """^(.*?)\$""".r val res = words.map { case dollarPattern(prePart) => prePart.trim case original => original }
内容的提问来源于stack exchange,提问作者IUnknown
相关产品推荐
相关产品推荐

