Scala:如何将List[Tuple3]转换为Map[String,String]

4

我有一个查询结果是 List[(Int,String,Double)],我需要将它转换为 Map[String,String](用于在 html select 列表中显示)。

我的临时解决方案是:

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

一定有更好的方法来实现同样的目标...

2个回答

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已经从map{}块中删除,但现在它已被添加到返回类型中 ;-(,编译器推断很棒,不喜欢类型类型类型,那是Java人的事情;-) - virtualeyes
1
@virtualeyes 要么你编写 toMap 并且必须创建一个中间集合,要么你使用 breakOut 和类型注释。 - Jean-Philippe Pellet
@Jean-Phillipe 噢,我的做法不仅不好,而且效率也低下。这里并没有什么大不了的,价格只由少数记录组成,任何方式都可以胜任,只是我想找到一个比我之前凑合着拼凑出来的解决方案更为简洁的解决方案。 - virtualeyes

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

这里你有,不错啊,+1,再加上奖励,简洁至上。 - virtualeyes
1
给事物命名比使用 p._1 等更易读。虽然 virtualeyes 可能考虑使 dao 返回一个 Pricing case class 而不是使用三元组,那么第二个选项就可以了。 - Matt R
我同意,我也更喜欢它。仅供参考。 - Johnny Everson
@MattR 你说得对,使用ScalaQuery,可以返回一个case class实例,但我想探索元组(因为绝大多数查询结果都被转换为case class实例,非常方便)。 - virtualeyes
@virtualeyes 很酷!可能因人而异,但我的个人风格规则是始终使用 case classes 而不是元组,其元数大于 2(除非所有用途都适合单个编辑器屏幕)。 - Matt R
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接