Scala 2.12如何将集合中String元素直接转换为Char类型
问题原因
你之前调用map(x=>x.toChar)失效的核心原因是Scala 2.12中String.split("")的拆分结果首元素是空字符串"",对长度为0的空字符串调用.toChar会抛出StringIndexOutOfBoundsException,不是Char类型转换的逻辑本身有问题。
你之前写的两段实现都存在冗余逻辑,甚至有异常风险:
- 第一段实现里对拆分后的每个字符串调
toCharArray.head,一旦碰到空字符串就会因为数组为空抛出NoSuchElementException,稳定性差 - 第二段实现用
flatMap拍平Char数组的方式绕开了空串问题,但拆分字符串、二次转数组拍平的流程完全是多余开销,性能很差
推荐实现
根本不需要用split("")做冗余拆分,Scala中字符串本身隐式转换为StringOps类型,自带集合操作能力,直接写就可以:
- 最优写法(性能最高,无额外集合转换开销)
// 直接遍历字符串的每个Char做判断,返回第一个匹配的索引,找不到返回-1 "strCapit".indexWhere(_.isUpper)
- 如果你习惯先显式转Char集合再操作,直接用
toCharArray即可,不要用split拆分:
"strCapit".toCharArray.indexWhere(_.isUpper)
补充说明
如果你非要沿用split的写法,需要先过滤掉拆分产生的空串再做类型转换,但是这种写法冗余度高,不推荐使用:
// 仅作演示,不推荐生产环境使用 "strCapit".split("").filter(_.nonEmpty).map(_.charAt(0)).indexWhere(_.isUpper)
内容的提问来源于stack exchange,提问作者davidzxc574
相关产品推荐
相关产品推荐

