Scala中如何将不可变Seq[Seq[Double]]转为可变Seq的可变Seq?
解决Scala不可变嵌套Seq转可变嵌套Seq的错误
嘿,我来帮你搞定这个Scala集合转换的问题!你遇到的错误是因为对to方法的用法理解有点偏差,咱们一步步拆解:
错误原因分析
你写的这段代码:
val mutable_being_inversed_matrix: collection.mutable.Seq[collection.mutable.Seq[Double]] = content.to[collection.mutable.Seq[collection.mutable.Seq[Double]]]
编译器报错说mutable.Seq[mutable.Seq[Double]] takes no type parameters, expected: one,核心问题在于:
to方法接受的是外层集合的类型构造器(也就是像mutable.Seq这种需要一个类型参数的“模板”),而不是已经填好所有类型参数的完整嵌套类型。- 你传入的
mutable.Seq[mutable.Seq[Double]]是一个已经实例化的具体类型,不是to方法期望的单参数类型构造器,所以编译器无法识别。
正确的转换方式
要实现不可变Seq[Seq[Double]]到可变mutable.Seq[mutable.Seq[Double]]的转换,需要分层处理:先把内层的不可变Seq转成可变的,再处理外层的集合。
方式一:使用map+to组合
这是最直观的写法,逐层转换:
import scala.collection.mutable val content: Seq[Seq[Double]] = Seq(Seq(1.0, 2.0), Seq(3.0, 4.0)) val mutableMatrix: mutable.Seq[mutable.Seq[Double]] = content.map(innerSeq => innerSeq.to[mutable.Seq]).to[mutable.Seq]
- 第一步:
content.map(innerSeq => innerSeq.to[mutable.Seq])把每个内层的不可变Seq[Double]转换成mutable.Seq[Double],得到Seq[mutable.Seq[Double]]。 - 第二步:
.to[mutable.Seq]把外层的不可变Seq转换成mutable.Seq,最终得到mutable.Seq[mutable.Seq[Double]]。
方式二:使用具体的可变集合实现(更推荐)
mutable.Seq是一个特质,实际开发中常用具体的实现类(比如ArrayBuffer)来避免潜在的类型歧义,写法如下:
import scala.collection.mutable.ArrayBuffer val content: Seq[Seq[Double]] = Seq(Seq(1.0, 2.0), Seq(3.0, 4.0)) val mutableMatrix: ArrayBuffer[ArrayBuffer[Double]] = content.map(innerSeq => ArrayBuffer.from(innerSeq)).to(ArrayBuffer)
这种写法更清晰,而且ArrayBuffer是Scala中最常用的可变序列实现之一,性能也不错。
补充说明
如果你的Scala版本比较新(2.13+),还可以用更简洁的to方法重载形式:
val mutableMatrix: mutable.Seq[mutable.Seq[Double]] = content.map(_.to(mutable.Seq)).to(mutable.Seq)
效果和方式一完全一致,只是语法更简洁。
内容的提问来源于stack exchange,提问作者JarsOfJam-Scheduler
相关产品推荐
相关产品推荐

