将Tuple2添加到scala列表

时间:2015-05-12 20:18:34

标签: java scala apache-spark

我有以下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)

我在这里遗漏了什么?谢谢!

3 个答案:

答案 0 :(得分:2)

Listscala.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)

Scala中的

List()是不可变的 - add操作不受支持。您可能需要查看scala.collection.mutable.LinkedList