如何声明空列表然后在scala中添加字符串?

rjc*_*rjc 76 scala

我有这样的代码:

val dm  = List[String]()
val dk = List[Map[String,Object]]()

.....

dm.add("text")
dk.add(Map("1" -> "ok"))
Run Code Online (Sandbox Code Playgroud)

但它会抛出运行时java.lang.UnsupportedOperationException.

我需要声明空列表或空映射,稍后在代码中需要填充它们.

par*_*tic 106

默认情况下,Scala列表是不可变的.您不能"添加"元素,但可以通过在前面附加新元素来形成新列表.由于它是一个列表,您需要重新分配引用(因此您不能使用val).

var dm  = List[String]()
var dk = List[Map[String,AnyRef]]()

.....

dm = "text" :: dm
dk = Map(1 -> "ok") :: dk
Run Code Online (Sandbox Code Playgroud)

操作员::创建新列表.您还可以使用较短的语法:

dm ::= "text" 
dk ::= Map(1 -> "ok")
Run Code Online (Sandbox Code Playgroud)

注意:在scala中不要使用类型,Object但是Any,AnyRefAnyVal.

  • @rjc Scala没有`mutable.List` - `List`是一个具体类型,其中唯一的实现是不可变的.有一些不可变的类,比如`LinkedList`和`DoubleLinkedList`,它们大多是辅助类.Java的`ArrayList`的Scala等价物是`ArrayBuffer`,相当于Java的`LinkedList`是`ListBuffer`.与Java的`List`对应的特征是`Seq` - 其中有`collection.Seq`并且扩展它,`collection.immutable.Seq`和`collection.mutable.Seq`. (11认同)
  • 默认情况下.如果你什么都不导入.`List`是不可变的.对于大多数用途,这是推荐的. (2认同)

Dan*_*ral 16

如果你需要改变东西,请使用ArrayBufferLinkedBuffer改为.但是,最好是解决这个问题:

我需要声明空列表或空映射,稍后在代码中需要填充它们.

不要这样做,而是使用返回元素的代码填充列表.有很多方法可以做到这一点,我将举几个例子:

// Fill a list with the results of calls to a method
val l = List.fill(50)(scala.util.Random.nextInt)

// Fill a list with the results of calls to a method until you get something different
val l = Stream.continually(scala.util.Random.nextInt).takeWhile(x => x > 0).toList

// Fill a list based on its index
val l = List.tabulate(5)(x => x * 2)

// Fill a list of 10 elements based on computations made on the previous element
val l = List.iterate(1, 10)(x => x * 2)

// Fill a list based on computations made on previous element, until you get something
val l = Stream.iterate(0)(x => x * 2 + 1).takeWhile(x => x < 1000).toList

// Fill list based on input from a file
val l = (for (line <- scala.io.Source.fromFile("filename.txt").getLines) yield line.length).toList
Run Code Online (Sandbox Code Playgroud)


agi*_*eel 13

正如大家已经提到的,这不是在Scala中使用列表的最佳方式......

scala> val list = scala.collection.mutable.MutableList[String]()
list: scala.collection.mutable.MutableList[String] = MutableList()

scala> list += "hello"
res0: list.type = MutableList(hello)

scala> list += "world"
res1: list.type = MutableList(hello, world)

scala> list mkString " "
res2: String = hello world
Run Code Online (Sandbox Code Playgroud)


gih*_*uka 8

正如上面的回答中提到的,Scala List是一个不可变的集合。您可以创建一个空列表.empty[A]。然后你可以使用一个方法:++:或者::为了将元素添加到列表中。

scala> val strList = List.empty[String]
strList: List[String] = List()

scala> strList:+ "Text"
res3: List[String] = List(Text)

scala> val mapList = List.empty[Map[String, Any]]
mapList: List[Map[String,Any]] = List()

scala> mapList :+ Map("1" -> "ok")
res4: List[Map[String,Any]] = List(Map(1 -> ok))
Run Code Online (Sandbox Code Playgroud)