2012-05-28 126 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

相关问题