将Scala映射转换为列表

将Scala映射转换为列表,scala,data-structures,Scala,Data Structures,我有一个映射,我需要映射到不同的类型,结果需要是一个列表。我有两种方法(似乎)来实现我想要的,因为在map上调用map似乎总是得到map。假设我有一些地图看起来像: val input = Map[String, List[Int]]("rk1" -> List(1,2,3), "rk2" -> List(4,5,6)) 我可以: val output = input.map{ case(k,v) => (k.getBytes, v) } toList 或: 在第一个示例中

我有一个映射,我需要映射到不同的类型,结果需要是一个列表。我有两种方法(似乎)来实现我想要的,因为在map上调用map似乎总是得到map。假设我有一些地图看起来像:

val input = Map[String, List[Int]]("rk1" -> List(1,2,3), "rk2" -> List(4,5,6))
我可以:

val output = input.map{ case(k,v) => (k.getBytes, v) } toList
或:

在第一个示例中,我转换类型,然后调用toList。我假设运行时类似于
O(n*2)
,所需的空间是
n*2
。在第二个示例中,我一次性转换类型并生成列表。我假设运行时是
O(n)
,所需的空间是
n

我的问题是,这些基本相同还是第二次转换减少了内存/时间/等等?此外,在哪里可以找到有关各种scala转换的存储和运行时成本的信息


提前谢谢。

我最喜欢做这类事情的方式是:

input.map { case (k,v) => (k.getBytes, v) }(collection.breakOut): List[(Array[Byte], List[Int])]

使用此语法,您将传递给
map
构建器,它需要重构生成的集合。(实际上,不是一个构建器,而是一个构建器工厂。如果您感兴趣,可以阅读更多有关Scala的
CanBuildFrom
s的信息。)
集合。在执行
映射时,如果您想从一种集合类型更改为另一种集合类型,可以使用breakOut
平面映射
,等等——唯一不好的部分是,为了使它有效,您必须使用完整的类型注释(这里,我在表达式后面使用了类型归属)。然后,没有构建中间集合,列表是在映射时构建的。

在第一个示例中映射视图可以减少大型映射的空间需求:

val output = input.view.map{ case(k,v) => (k.getBytes, v) } toList

+1.对于那些试图了解突破的人,请参见Daniel Sobral关于懒惰观点的精彩答案:
val output = input.view.map{ case(k,v) => (k.getBytes, v) } toList