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

时间:2015-12-08 11:17:52

标签: scala scala-collections

是否有一种通用的方法将Scala中的一些可变集合转换为其不可变对应集合(假设它有一个)?

用例示例......

private[this] val _collection: mutable.TreeSet[A]

def collection: immutable.TreeSet[A] = {
  // convert mutable _collection to immutable version for public consumption
}

我尝试了以下内容......

def collection: immutable.TreeSet[A] = {
  _collection.to[immutable.TreeSet[A]]
}

...但是这导致编译时出现了一个神秘的错误消息......

scala.collection.immutable.TreeSet[A] takes no type parameters, expected: one

......有什么想法吗?

2 个答案:

答案 0 :(得分:2)

我怀疑必须从头开始创建immutable.TreeSet

  trait Aaa[A] {
    val _collection: mutable.TreeSet[A]

    def collection: immutable.TreeSet[A] = {
      immutable.TreeSet.empty[A] ++ _collection
    }
  }

编辑以跟进评论

来自immutable.TreeSet的scala-2.11.7源代码:

import scala.collection.immutable.{RedBlackTree => RB}

private def newSet(t: RB.Tree[A, Unit]) = new TreeSet[A](t)

不幸的是newSet是私有的,来自mutable.TreeSet

class TreeSet[A] private (treeRef: ObjectRef[RB.Tree[A, Null]], from: Option[A], until: Option[A])

构造函数也是私有的......

答案 1 :(得分:0)

如果您不关心最终得到的特定Set实施方式,那么前进的方法就是val immutableSet = mutableSet.toSet

如果你特意想要不可变的TreeSet,而不仅仅是Set,你将需要使用breakOut:

val immutableSet: immutable.TreeSet[T] = mutableSet.map(identity)(collection.breakOut)