有
val a: IndexedSeq[String] = Array("one", "two", "three")
def f(s: String): Int = s match {
case "one" => 1; case "two" => 2; case "three" => 3;
case _ => throw new IllegalArgumentException
}
我如何最好地推导
val m: Map[String, Int] = Map("one" -> 1, "two" -> 2, "three" -> 3)
假设我不介意引入代理函数来将键值对作为元组返回,如果这样可以提供更好的解决方案。
PS:我实际上对如何将一个集合映射到一个不同的所需类型的集合感兴趣,但是选择这个例子作为一个特例来说明并使问题更具体。这意味着特定情况(IndexedSeq to Map)解决方案是可以接受的,但欢迎使用更通用的注释。现在我使用foreach
为这种情况填充可变映射缓冲区,但这似乎与真正的Scala功能方式恕我直言。我发现自己使用了太多的{{1}}和可变缓冲区让我感到紧张,这就是为什么我会问这些关于映射的问题。
答案 0 :(得分:5)
出了什么问题:
a map {i => (i, f(i))} toMap
制造
scala.collection.immutable.Map[String,Int] = Map(one -> 1, two -> 2, three -> 3)
答案 1 :(得分:2)
这是更有效但完全理解的更复杂。这样可以避免IndexedSeq[(String, Int)]
创建的中间map
。只是玩得开心; - )
val result: Map[String, Int] = a.map(i => (i, f(i)))(scala.collection.breakOut)
请参阅此SO帖子:Scala 2.8 breakOut