我有这样的代码:
val dm  = List[String]()
val dk = List[Map[String,Object]]()
.....
dm.add("text")
dk.add(Map("1" -> "ok"))
但它会抛出运行时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
操作员::创建新列表.您还可以使用较短的语法:
dm ::= "text" 
dk ::= Map(1 -> "ok")
注意:在scala中不要使用类型,Object但是Any,AnyRef或AnyVal.
Dan*_*ral 16
如果你需要改变东西,请使用ArrayBuffer或LinkedBuffer改为.但是,最好是解决这个问题:
我需要声明空列表或空映射,稍后在代码中需要填充它们.
不要这样做,而是使用返回元素的代码填充列表.有很多方法可以做到这一点,我将举几个例子:
// 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
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
正如上面的回答中提到的,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))
| 归档时间: | 
 | 
| 查看次数: | 136097 次 | 
| 最近记录: |