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与flatMap

Scala如何在以下列表中相交类型Map [String,Double]的映射:List [Map [String,Double]]

Scala中List(Map1,Map2,Map3 ....) 转成一个Map

Scala-LIST/Tuple/Map

Scala spark 如何与 List[Option[Map[String, DataFrame]]] 交互