【问题标题】:Scala do I have to convert to a Seq when creating a collection from an iterable?从可迭代对象创建集合时,Scala 是否必须转换为 Seq?
【发布时间】:2010-10-15 04:40:54
【问题描述】:

也许我(再次)找错了树,但如果将属性键入为scala.collection.immutable.Set[A] 是正常做法,那么在给定scala.Iterable[A] 的情况下,您将如何创建其中一个?例如:

class ScalaClass {
    private var s: scala.collection.immutable.Set[String]

    def init(): Unit = {
        val i = new scala.collection.mutable.HashSet[String] 
        //ADD SOME STUFF TO i

        s = scala.collection.immutable.Set(i) //DOESN'T WORK

        s = scala.collection.immutable.Set(i toSeq : _ *) //THIS WORKS
    }
}

有人可以解释为什么有必要通过Seq 创建不可变集(或者如果不是,那么我该怎么做)?

【问题讨论】:

    标签: scala scala-collections


    【解决方案1】:

    基本上是因为您通过“规范工厂方法”应用在 Set 的伴随对象中创建不可变 Set,该对象采用序列或“可变参数”(如 Set(a,b,c))。看到这个:
    http://scala-tools.org/scaladocs/scala-library/2.7.1/scala/collection/immutable/Set$object.html

    我认为标准库中没有其他方法可以做到这一点。

    【讨论】:

      【解决方案2】:

      它将制作一个不可变的副本:

      scala> val mu = new scala.collection.mutable.HashSet[String]
      mu: scala.collection.mutable.HashSet[String] = Set()
      
      scala> val im = mu.clone.readOnly
      im: scala.collection.Set[String] = ro-Set()
      

      【讨论】:

      • 对不起,我不太明白你的意思。我的问题是为什么从 Iterable 转换为不可变 Collection 并不容易(通过 Seq 除外)。显然你给了我一个只读集合;不是一成不变的
      • 是的,它是只读的……不就是不可变的同义词吗?也许并不总是......但在这种情况下?你知道改变这个集合的方法吗?这是它的唯一接口,它是只读的。它永远不会改变。
      猜你喜欢
      • 1970-01-01
      • 2018-06-29
      • 1970-01-01
      • 2015-09-14
      • 2017-05-17
      • 2022-07-05
      • 1970-01-01
      • 1970-01-01
      • 2011-04-04
      相关资源
      最近更新 更多