Scala-将字符串数组解析为单个字符串的更好方法

时间:2018-08-02 12:02:26

标签: scala function

我已经实现了一种方法,该方法应该将字符串数组转换为单个字符串。但是在将其与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 => ""
        }
      }

3 个答案:

答案 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 = ""