如何在scala中保留List [T]的一些键值对?

时间:2016-06-22 04:29:43

标签: list scala

我有一个List [T],里面的数据如下所示:

[0]- id : "abc", name: "xyz", others: "value"
[1]- id : "bcd", name: "dsf", others: "value"

现在我想返回相同的List [T]但是带有id和名称,即返回的List将是:

[0]- id : "abc", name: "xyz"
[1]- id : "bcd", name: "dsf"

我尝试使用以下代码:

var temps = templates.map(x => List("id" -> x.id, "name" -> x.name))

但它在List中产生List,即:

[0]-
  [0] id : "abc"
  [1] name: "xyz"
[1]- 
  [0] id : "bcd"
  [1] name: "dsf"

我也尝试了元组但是徒劳无功。我怎样才能映射我的列表,以便除了id和名称值对之外一切都被清除?

3 个答案:

答案 0 :(得分:1)

除非您想要仅使用idname字段定义新类,否则我认为元组将是您最好的选择:

scala> case class obj(id: String, name: String, others: String)
defined class obj

scala> val l = List(new obj("abc", "xyz", "value"), new obj("bcd", "dsf", "value"))
l: List[obj] = List(obj(abc,xyz,value), obj(bcd,dsf,value))

scala> l.map(x => (x.id, x.name))
res0: List[(String, String)] = List((abc,xyz), (bcd,dsf))

此外,您实际上在示例中使用元组,->语法在Scala中创建元组:

scala> "a" -> "b"
res1: (String, String) = (a,b)

这是“定义另一个类”选项:

scala> case class obj2(id: String, name: String){
     | def this(other: obj) = this(other.id, other.name)
     | }
defined class obj2

scala> l.map(new obj2(_))
res2: List[obj2] = List(obj2(abc,xyz), obj2(bcd,dsf))

答案 1 :(得分:1)

鉴于List[T]List[Map],您可以执行以下操作:

//Remove the "others" key.
val temps = templates.map( map => {map - "others"})

答案 2 :(得分:0)

我认为很清楚你的列表包含三个成员的对象:id,name,others。因此,您可以使用

访问它们
  

{x => x.name}

我不太确定,你是如何想象你的最终结果的。你显然需要一些数据结构来保存成员。 你意识到自己,将每个对象成员存储在新列表中的列表中并不是很好,但你似乎对元组不好?

我可以想象,元组正是你想要的。

val newList = oldList.map{e => e.id -> e.name}

导致像这样的alist:

  

列表((“id_a”,“name_a”),(“id_b”,“name_b”),(“id_c”,“name_c”))

可以像这样访问(例如):

newList.head._1

表示第一个元组ID,

newList.head._2

表示第一个元组名称。

另一种选择可能是映射到地图,因为这看起来很像,你想要的第一个:

newMap = oldList.map{e => e.id -> e.name}.toMap

通过这种方式,您可以访问此newMap("key")或更安全的成员:newMap.get("key"),如果密钥不存在,则会返回一个选项并且不会以异常结束。