2015-06-30 129 views
0

使用我有一个列表,可以有一个字符串或选项[字符串]字符串选项[字符串]的斯卡拉名单与mkString

这样

val a = List("duck","dog","cat") 

a.mkString(:) 

duck:dog:cat 

val b = List(Some("duck"), "dog", None) 

和我的输出应该是

“鸭:狗”

我怎样才能做到这一点,我得到一些aproximation本:

scala> a.map{ x => 
    | x match { 
    | case x:String => x 
    | case Some(x:String) => x 
    | case None => null}} 

List[String] = List(duck, dog, null) 

scala> res.filter(_!=null).mkString(":") 
res24: String = duck:dog 

有没有更好的方法,做到这一点?

+5

理想情况下,你会解决,如果给什么你是一个List [Any]'。 – Ryan

+0

你可以有'null'而不是'None'吗? – nattyddubbs

回答

3

这是使用collect一个很好的例子。 我们想创建一个元素只是一部分名单,然后我们想用mkString

val b = List(Some("duck"), "dog", None) 

val result: List[String] = b collect { 
    case x: String => x 
    case Some(x: String) => x 
} 
result.mkString(":") 
1

你可以flatMap摆脱filter的:

b.flatMap { 
    case x: String => List(x) 
    case Some(x) => List(x) 
    case None => List() 
    }.mkString(":") 

,或者你可以filtermap

b.filter(_ != None).map { 
    case x: String => x 
    case Some(x) => x 
    }.mkString(":") 
0

这里是一个很安全的null

scala> val l = List(Some("duck"), "dog", None, null) 
l: List[java.io.Serializable] = List(Some(duck), dog, None, null) 

scala> l.map{a => a match { 
     | case null => "" 
     | case Some(a) => Some(a).get.toString 
     | case None => "" 
     | case _ => a.toString}}.filter(_.length > 0).mkString(":") 

res7: String = duck:dog