Scala:List[Tuple3] 到 Map[String,String]
Posted
技术标签:
【中文标题】Scala:List[Tuple3] 到 Map[String,String]【英文标题】:Scala: List[Tuple3] to Map[String,String] 【发布时间】:2012-06-02 20:43:25 【问题描述】:我有一个 List[(Int,String,Double)]
的查询结果,我需要将其转换为 Map[String,String]
(用于在 html 选择列表中显示)
我的破解方法是:
val prices = (dao.getPricing flatMap
case(id, label, fee) =>
Map(id.toString -> (label+" $"+fee))
).toMap
必须有更好的方法来达到同样的效果......
【问题讨论】:
【参考方案1】:这个怎么样?
val prices: Map[String, String] =
dao.getPricing.map
case (id, label, fee) => (id.toString -> (label + " $" + fee))
(collection.breakOut)
collection.breakOut
方法提供了一个 CanBuildFrom
实例,该实例确保即使您从 List
映射,Map
也会通过类型注释被重建,并避免创建中间集合.
【讨论】:
+1。奇怪,collection.breakout 到底是什么? ;-) 我喜欢 Map 已从 map 块中删除,但现在它已添加到返回类型中 ;-(,编译器推理很糟糕,不像 type type type,那是给 Java 人的 ;-) @virtualeyes 要么你写 toMap 并且你必须创建一个中间集合,要么你使用带有类型注释的breakOut
。
@Jean-Phillipe 啊,好吧,所以我的方法不仅很差,而且效率也很低;-) 没什么大不了的,定价由少量记录组成,无论哪种方式都能奏效,只是在寻找比我一起破解的更清洁的解决方案【参考方案2】:
简洁一点:
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
【讨论】:
好了,不错,+1,还有奖品,简洁为王 +1 表示第一个选项,-1 表示第二个选项...给事物命名在 lot 处比 p._1 等更具可读性(尽管 virtualeyes 可能会考虑制作dao 返回一个定价案例类而不是使用三元组,在这种情况下,第二个选项会很好)。 我同意,我也更喜欢它。刚刚添加以供参考。 @MattR 你说得对,使用 ScalaQuery 也可以返回一个案例类实例,但我想我会探索元组(因为绝大多数查询结果都被转换为案例类实例,相当方便) @MattR 我切换到案例类实例,最干净的方法,与返回元组子集相比,额外开销最小以上是关于Scala:List[Tuple3] 到 Map[String,String]的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Scala 中将元素添加到 Map 中,其中键是字符串,值是 List[String]
Scala如何在以下列表中相交类型Map [String,Double]的映射:List [Map [String,Double]]