有
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
}
Run Code Online (Sandbox Code Playgroud)
我怎样才能得到最好的结果
val m: Map[String, Int] = Map("one" -> 1, "two" -> 2, "three" -> 3)
Run Code Online (Sandbox Code Playgroud)
假设我不介意引入代理函数来将键值对作为元组返回,如果这样可以提供更好的解决方案.
PS:我实际上对如何将一个集合映射到一个不同的所需类型的集合感兴趣,但是选择这个例子作为一个特例来说明并使问题更具体.这意味着特定情况(IndexedSeq to Map)解决方案是可以接受的,但欢迎使用更通用的注释.现在我使用foreach为这种情况填充可变映射缓冲区,但这似乎与真正的Scala功能方式恕我直言.我发现自己使用了太多的foreach可变缓冲区让我感到紧张,这就是为什么我会问这些关于映射的问题.
出了什么问题:
a map {i => (i, f(i))} toMap
Run Code Online (Sandbox Code Playgroud)
生产:
scala.collection.immutable.Map[String,Int] = Map(one -> 1, two -> 2, three -> 3)
Run Code Online (Sandbox Code Playgroud)