如何在scala中添加成员到列表(不可变)?

时间:2017-07-03 08:04:42

标签: scala

我想将一个成员添加到列表中,但列表是不可变的。有人告诉我,Scala在许多方面更喜欢不可变列表。提前谢谢。

 class Family[T]{
    val list: List[T] = List();
    def add(member: T): Unit = { member :: this.list }
    def getFamilyNames(f: T => String){
        println(list.size)
        list.foreach {
            println
        }
    }
}

3 个答案:

答案 0 :(得分:0)

您可以使用名为ListBuffer[T]ArrayBuffer[T]

的可变列表
class Family[T]{

  val list = ListBuffer[T]()

  def add(member: T): Unit = { this.list+=member }

  def getFamilyNames(f: T => String){

    println(list.size)
    list.foreach {
      println
    }
  }

}

class SomeSpecs extends FunSuite with Matchers {

  test("adds value to family") {

    val fam  = new Family[String]
    fam.add(new String("some value"))
    fam.add(new String("some other value"))

    fam.list shouldBe ListBuffer("some value", "some other value")
  }
}

请阅读Which scala mutable list to use?了解详情。

答案 1 :(得分:0)

您的head方法无法满足您的期望。 add会返回一个新列表,其中添加了额外成员。但是,您明确地丢弃了它的类型为List [T]的返回值。也就是说,在列表中添加元素不会修改列表:它只返回一个新的不可变List。 你可能想要的东西是:

member :: this.list

但是,通常情况下,如果你想坚持功能性方法,你想避免副作用

答案 2 :(得分:0)

如果你想拥有一切不可变的东西,你应该创建新的Family实例,因为在其他情况下,Family的实例是可变的

class Family[T](list: List[T] = List()){
  def add(member: T): Unit = new Family(member :: this.list)
}

如果家庭是一个比使用可变集合更好的东西。如果它不是构建者,请查看它的用法,可能您根本不需要“添加”方法。