小心Scala/Java的split函数 2015-04-11 03:44:40 最近使用scala在spark上做开发,遇到一个怪异的问题,代码逻辑没问题,最终处理的数据居然不合逻辑。起初以为是spark的问题,最终排查后发现是scala的split函数的问题。 也不能说是scala的split函数有问题吧,它的split默认行为与其他语言不一样。 在python下: ```python a = '1,2,3,,,'.split(',') # a的值为['1', '2', '3', '', '', ''] ``` 在js下: ```js a = '1,2,3,,,'.split(',') # a的值为["1", "2", "3", "", "", ""] ``` 其他语言就不一一举例了,在看看Scala的split的默认行为: ```scala val a = "1,2,3,,,".split(',') # a的值为["1", "2", "3"] ``` 这尼玛,如果后面的字符串都是空值,默认都给省掉了!这也是导致我的代码运行行为怪异的根本原因! **注意:这里Scala或Java只有分隔后后面的内容为空的情况下才会省略,中间的空内容是不会省略的,如下:** ``` scala> "a,,,b,c".split(',') res3: Array[String] = Array(a, "", "", b, c) ``` 当然scala也提供了额外的参数,来保证split的行为和其他语言一致: ```scala val a = "1,2,3,,,".split(",", -1) # a的值为["1", "2", "3", "", "", ""] ``` 设置split的limit参数为-1,就可以正常的得到后面的空字符串了。 小心Scala的split函数!!他的默认行为有可能导致你的代码逻辑不正常!! [参考] <http://stackoverflow.com/questions/29448343/spark-scala-split> 非特殊说明,均为原创,原创文章,未经允许谢绝转载。 原始链接:小心Scala/Java的split函数 赏 Prev 需要关注的企业或产品 Next 使用ssh打洞实现反向代理访问内网服务