我有以下scala代码,它试图将(String,Int)元组添加到列表中。
val myTupleList: List[(String,Int)] = List()
for (record <- recordList) {
val nameKey = record.getName()
myTupleList.add((nameKey,1))
}
但是,我在myTupleList.add((nameKey,1))行收到以下错误。
java.lang.UnsupportedOperationException
at java.util.AbstractList.add(AbstractList.java:148)
at java.util.AbstractList.add(AbstractList.java:108)
我在这里遗漏了什么?谢谢!
答案 0 :(得分:2)
List
(scala.collection.immutable.List
)不可变。相反,使用 mutable 构造,如ListBuffer
例如:
scala> val buf = scala.collection.mutable.ListBuffer.empty[(String,Int)]
buf : scala.collection.mutable.ListBuffer[(String, Int)] = ListBuffer()
scala> buf += (("test", 1))
res0: test.buf.type = ListBuffer((test,1))
Here,您可以看到可变集合的概述。
答案 1 :(得分:1)
你似乎有一个java.util.AbstractList [Record],你想要一个scala.collection.immutable.List [(String,Int)]。为什么不尝试使用地图功能呢?要引用scala文档,请使用map函数:
通过将函数应用于此集合的所有元素来构建新集合。
首先,我们需要将JavaConversions放入范围,将java集合隐式转换为scala集合(确切地说是scala.collection.mutable.Buffer):
import scala.collection.JavaConversions._
现在我们有了范围内的地图,我们可以使用地图功能。这里我们获取记录对象并返回一个元组。我们使用.toList调用来获取我们想要的scala集合类型:
val myTupleList: List[(String,Int)] = recordList.map {
record =>
val nameKey = record.getName()
(nameKey, 1)
}.toList
或者我们可以将它砍掉一点并使用箭头功能“ - &gt;”构建一个Tuple2:
val myTupleList: List[(String,Int)] = recordList.map(record => record.getName -> 1).toList
或者使用函数占位符更简洁地编写它:
val myTupleList: List[(String,Int)] = recordList.map(_.getName() -> 1).toList
答案 2 :(得分:0)
List()
是不可变的 - add
操作不受支持。您可能需要查看scala.collection.mutable.LinkedList
。