Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 使用函数从集合创建映射_Scala_Scala Collections - Fatal编程技术网

Scala 使用函数从集合创建映射

Scala 使用函数从集合创建映射,scala,scala-collections,Scala,Scala Collections,我想通过提供映射函数从集合创建映射。它基本上相当于一个普通的map方法,只是我希望它返回一个map,而不是一个平面集合 我希望它有这样的签名 def toMap[T, S](T => S): Map[T, S] 这样调用时 val collection = List(1, 2, 3) val map: Map[Int, String] = collection.toMap(_.toString + " seconds") map的预期值为 Map(1 -> "1 seconds"

我想通过提供映射函数从集合创建映射。它基本上相当于一个普通的
map
方法,只是我希望它返回一个
map
,而不是一个平面集合

我希望它有这样的签名

def toMap[T, S](T => S): Map[T, S]
这样调用时

val collection = List(1, 2, 3)
val map: Map[Int, String] = collection.toMap(_.toString + " seconds")
map
的预期值为

Map(1 -> "1 seconds", 2 -> "2 seconds", 3 -> "3 seconds")
该方法相当于

val collection = List(1, 2, 3)
val map: Map[Int, String] = collection.map(x => (x, x.toString + " seconds")).toMap

Scala中有这样的方法吗?

没有这样的单一方法。正如您所说,您可以使用
map
后跟
toMap
。如果您关注正在创建的中介列表,则可以考虑使用<代码> BuffeS/<代码>作为隐式第二个参数到<代码> MAP>代码>:

import scala.collection.breakOut
val map: Map[Int, String] = collection.map(x => (x._1, x._2.toString + " seconds"))(breakOut)
您可以阅读有关
breakOut
map
的隐式参数的更多信息

此方法允许您构造具有适当的
CanBuildFrom
实现的其他类型,而无需中间步骤:

val arr: Array[(Int, String)] = collection.map(x => (x._1, x._2.toString + " seconds"))(breakOut)

您可能还想考虑使用禁止创建中间集合的视图:

val m = (List("A", "B", "C").view map (x => x -> x)).toMap
描述了这些方法之间的差异


最后,还有
mapValues
方法,如果您只映射每个键值对的值,那么它可能适合您的目的。但是要小心,因为此方法实际上返回一个视图,并且可能会导致意外的性能影响。

scalaz为
functor
提供了一个
fproduct
方法,它以正确的形状返回要调用的内容。对结果进行映射:

scala> import scalaz._,Scalaz._
import scalaz._
import Scalaz._

scala> val collection = List(1, 2, 3)
collection: List[Int] = List(1, 2, 3)

scala> collection.fproduct(_.toString + " seconds").toMap
res0: scala.collection.immutable.Map[Int,String] = Map(1 -> 1 seconds, 2 -> 2 seconds, 3 -> 3 seconds)

您可能正在谈论zipWithIndex,谢谢您的回答。我并不是特别担心中间人的收藏。它就像是标准库的一部分,但我找不到它。我同意它丢失了。在.NET中,
ToMap
方法接受参数,这些参数允许您使用lambdas定义键和值,这通常很有用<代码>映射值是一个很好的助手。