2013-02-27 24 views
3

我有一個案例類在斯卡拉 - 轉換的情況下,類List成元組

case class table(a: String, b: Option[String]) 

和我有該類型的列表的列表 - 讓叫它LIST1

val list1: List[table] = tabele.get() // just filling the list from an SQL 

現在我想要將「表」的列表改爲(String,Option [String])的簡單列表 我在該主板上發現的是如何將case類轉換爲如下的元組 :

case class table(a:String, b:Int) 
val (str, in) = table.unapply(table("test", 123)).get() 

但我不知道如何在列表中使用這個:( 我想的東西用foreach這樣的:

val list2: List[(String, Option[String])] = Nil 
list1.foreach(x => list2 :: table.unapply(x).get()) 
'error (String,Option[String]) does not take parameters 

所以我的問題是 - >我怎麼能不應用上的每一個元組使用一個列表?

提前感謝


PS:其實我是想改變列表的類型,因爲我想用 「.toMap」 該名單 上 - 這樣的:

val map1 = list1.toMap.withDefaultValue(None) 

與錯誤:

Cannot prove that models.table <:<(T,U) 

它會工作的(字符串,選項[字符串])列表

回答

10

你想轉換列表中的每個元素給出另一個列表。你需要foreach的表弟,map

嘗試:

list1.map(table.unapply).flatten 

這是寫作的一種更好的方式:

list1.map(tbl => table.unapply(tbl)).flatten 

另一種方式是

list1.map(table.unapply(_).get) 

哪個速記

list1.map(tbl => table.unapply(tbl).get) 

而只是爲了在使用for版本拋出:(這是說明性的引擎蓋下是如何unapply用於for內涵)

for (table(s,ms) <- list1) yield (s, ms) 
+0

是做到了!謝謝 – RohbRoy 2013-02-27 14:08:51

+5

點免費版:'list1 flatMap table.unapply' – sschaef 2013-02-27 16:22:53

+0

爲什麼我沒有想到... ... – Faiz 2013-02-27 16:25:43