Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.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_Collections - Fatal编程技术网

Scala 将可变集合转换为不可变集合

Scala 将可变集合转换为不可变集合,scala,collections,Scala,Collections,我正在寻找将collection.mutable.Seq[T]转换为collection.immutable.Seq[T]的最佳方法,具体如下: def convert[T](sq: collection.mutable.Seq[T]): collection.immutable.Seq[T] = collection.immutable.Seq[T](sq:_*) 添加 本机方法使用起来有点棘手。它们已在scala.collection.Seq上定义,您必须仔细查看它们是否返回集合.i

我正在寻找将
collection.mutable.Seq[T]
转换为
collection.immutable.Seq[T]
的最佳方法,具体如下:

def convert[T](sq: collection.mutable.Seq[T]): collection.immutable.Seq[T] = 
  collection.immutable.Seq[T](sq:_*)
添加

本机方法使用起来有点棘手。它们已在
scala.collection.Seq
上定义,您必须仔细查看它们是否返回
集合.immutable
集合.mutable
。例如,
.toSeq
返回一个不保证可变性的
集合.Seq
<但是,code>.toIndexedSeq返回一个
集合.immutable.IndexedSeq
,因此使用起来似乎很好。不过,我不确定这是否真的是预期的行为,因为还有一个
集合.mutable.IndexedSeq

最安全的方法是手动将其转换为如上所示的预期集合。在使用本机转换时,我认为最好的做法是添加类型注释,包括(
mutable
/
immutable
),以确保返回正确的集合。
toList
(或者
toStream
,如果您希望它是惰性的)是您想要
LinearSeq
的首选方法,正如您可以确定得到的是不可变的(因为列表和流是不可变的)。如果您想要一个不可变的
IndexedSeq
,则没有
toVector
方法,但是
toIndexedSeq
似乎总是给您一个向量(它是不可变的)

另一种方法是使用
breakOut
。这将在您的退货类型中查看您的目标类型,如果可能的话,请帮助您。e、 g

scala> val ms = collection.mutable.Seq(1,2,3)
ms: scala.collection.mutable.Seq[Int] = ArrayBuffer(1, 2, 3)

scala> val r: List[Int] = ms.map(identity)(collection.breakOut)
r: List[Int] = List(1, 2, 3)

scala> val r: collection.immutable.Seq[Int] = ms.map(identity)(collection.breakOut)
r: scala.collection.immutable.Seq[Int] = Vector(1, 2, 3)

有关此类黑魔法的更多信息,请喝些浓咖啡,然后查看。

如果要将
ListBuffer
转换为
列表,请使用
.toList
。我之所以提到这一点,是因为特定的转换是在恒定的时间内执行的。但是请注意,如果进一步使用
ListBuffer
,将首先复制其内容


否则,您可以执行
collection.immutable.Seq(xs:*)
,假设xs是可变的,因为您不可能以任何其他方式获得更好的性能。

如果您还使用
Set
Map
,您也可以使用
TreeSet
作为示例来尝试这些操作

import scala.collection.mutable

val immutableSet = TreeSet(blue, green, red, yellow)

//converting a immutable set to a mutable set
val mutableSet = mutable.Set.empty ++= immutableSet

//converting a mutable set back to immutable set
val anotherImmutableSet = Set.empty ++ mutableSet

上面的例子来自Scala

Nice中的编程书籍。但是像
.toIndexedSeq
.toStream
这样的原生方法呢?我只是不确定哪一个是最好的解决方案。这似乎不起作用-我最终得到一个带有一个元素的不可变序列(可变序列)。愚蠢的斯卡拉。