2015-06-30 127 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