我已经实现了一种方法,该方法应该将字符串数组转换为单个字符串。但是在将其与UDF一起使用并将UDF应用于列时遇到异常: val concatUdf = udf(convertArray)
java.lang.ClassCastException: scala.collection.mutable.WrappedArray$ofRef cannot be cast to [Ljava.lang.String;
在当前的实现中,为了返回有效的String应该做哪些改进?我是Scala的新手,可能这不是最优雅的解决方案。
def convertArray: Array[String] => String =
(strings: Array[String]) => {
Option(strings) match {
case Some(arr) => strings.mkString(", ")
case Some(Array()) => ""
case None => ""
}
}
答案 0 :(得分:1)
我相信你可以做到
def convertArray(strings: Array[String]): String =
if (strings.nonEmpty)
strings.mkString(", ")
else
""
在您的代码中,第二个case
无法访问,因为您的第一种情况将始终匹配,包括空数组。就是说,您的代码似乎对我在Scala 2.12.6
上正常工作(除了有关无法访问代码的警告):
scala> def convertArray: Array[String] => String =
| (strings: Array[String]) => {
| Option(strings) match {
| case Some(arr) => strings.mkString(", ")
| case Some(Array()) => ""
| case None => ""
| }
| }
<console>:15: warning: unreachable code
case Some(Array()) => ""
^
convertArray: Array[String] => String
scala> convertArray(Array())
res1: String = ""
scala> convertArray(Array("bro"))
res2: String = bro
scala> convertArray(Array("bro", "dude"))
res3: String = bro, dude
答案 1 :(得分:1)
只需使用mkString,无需重新发明轮子:
println(Array().mkString(", "))
println(Array("hello").mkString(", "))
println(Array("hello", "world").mkString(", "))
输出:
//empty string
hello
hello, world
答案 2 :(得分:0)
def convertArray(strings: Array[String]): String = Option(strings).getOrElse(Array()).mkString(", ")
输出:
scala> def convertArray(strings: Array[String]): String = Option(strings).getOrElse(Array()).mkString(", ")
convertArray: (strings: Array[String])String
scala> convertArray(Array("to", "to", "ta", "ta"))
res16: String = to, to, ta, ta
scala> convertArray(Array())
res17: String = ""
scala> convertArray(null)
res18: String = ""