2012-05-28 124 views
4

我已經得到了List[(Int,String,Double)]的查詢結果,我需要轉換爲Map[String,String](用於顯示一個HTML選擇列表)斯卡拉:列表[Tuple3]到地圖[字符串,字符串]

我砍死解決方案:

val prices = (dao.getPricing flatMap { 
    case(id, label, fee) => 
    Map(id.toString -> (label+" $"+fee)) 
    }).toMap 

必須有一個更好的方法來達到同樣的...

回答

8

一點更簡潔:

val prices = 
    dao.getPricing.map { case (id, label, fee) => (id.toString, label+" $"+fee)} toMap 

較短替代:

val prices = 
    dao.getPricing.map { p => (p._1.toString, p._2+" $"+p._3)} toMap 
+0

美味,你甚至設法定義了一個沒有名字的val ;-) – virtualeyes

+0

你去了,好的一個,+1,再加上一個獎,簡潔是國王 – virtualeyes

+0

你着火了,更喜歡前者雖然,意圖更清晰...... – virtualeyes

9

這個怎麼樣?

val prices: Map[String, String] = 
    dao.getPricing.map { 
    case (id, label, fee) => (id.toString -> (label + " $" + fee)) 
    }(collection.breakOut) 

的方法collection.breakOut提供了CanBuildFrom實例確保即使你從List映射,一個Map重建,這要歸功於類型標註,避免中介收集的創建。

+1

1。奇怪,究竟是什麼collection.breakout? ;-)我喜歡Map已經從地圖{}塊中移除,但現在它已被添加到返回類型中;-(編譯器推斷岩石,不像type type類型,對於Java人來說;-) – virtualeyes

+1

@virtualeyes要麼寫入地圖,而必須創建中間集合,或者使用帶有類型註釋的'breakOut'。 –

+0

@ Jean-Phillipe ah ok,所以我的方法不僅很差,而且效率也很低;-)在這裏沒什麼大不了的,定價由少量記錄組成,任何一種方法都只是尋找更乾淨的解決方案比我一起砍的 – virtualeyes

相關問題