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

List 如何在scala中保留列表[T]的一些键值对?,list,scala,List,Scala,我有一个列表[T],其中的数据如下: [0]- id : "abc", name: "xyz", others: "value" [1]- id : "bcd", name: "dsf", others: "value" 现在我想返回相同的列表[T],但带有id和名称,即返回的列表将是: [0]- id : "abc", name: "xyz" [1]- id : "bcd", name: "dsf" 我尝试了以下代码: var temps = templates.map(x => L

我有一个列表[T],其中的数据如下:

[0]- id : "abc", name: "xyz", others: "value"
[1]- id : "bcd", name: "dsf", others: "value"
现在我想返回相同的列表[T],但带有id和名称,即返回的列表将是:

[0]- id : "abc", name: "xyz"
[1]- id : "bcd", name: "dsf"
我尝试了以下代码:

var temps = templates.map(x => List("id" -> x.id, "name" -> x.name))
但它会在列表中生成列表,即:

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

我也尝试了tuple,但没有成功。我如何映射我的列表以清除除id和name-value对之外的所有内容呢?

除非您想定义一个只包含
id
name
字段的新类,否则元组将是您最好的选择:

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)
以下是“定义另一个类”选项:


除非您想定义一个只包含
id
name
字段的新类,否则我认为tuple是您最好的选择:

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)
以下是“定义另一个类”选项:


我认为很明显,您的列表包含有三个成员的对象:id、name和others。因此,您可以使用

{x=>x.name}

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

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

val newList = oldList.map{e => e.id -> e.name}
结果如下:

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

并且可以这样访问(例如):

对于第一个元组ID,以及

newList.head._2
对于第一个元组名称

另一个选项是映射到地图中,因为这看起来非常像您首先想要的:

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

通过这种方式,您可以访问以下成员:
newMap(“key”)
或更安全的:
newMap.get(“key”)
,它返回一个选项,如果密钥不存在,则不会出现异常。

我认为很明显,您的列表包含三个成员:id、name和others。因此,您可以使用

{x=>x.name}

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

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

val newList = oldList.map{e => e.id -> e.name}
结果如下:

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

并且可以这样访问(例如):

对于第一个元组ID,以及

newList.head._2
对于第一个元组名称

另一个选项是映射到地图中,因为这看起来非常像您首先想要的:

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

通过这种方式,您可以访问以下成员:
newMap(“key”)
或更安全的成员:
newMap.get(“key”)
,如果密钥不存在,它将返回一个选项,并且不会出现异常。

如果
列表[t]
是一个
列表[Map]
,则您可以执行以下操作:

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

假设
List[T]
是一个
List[Map]
,那么您可以执行以下操作:

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

没有case类obj有什么办法吗?我只是为了说明目的添加了它。如果您想使用
操作符从对象中获取属性(就像您对
x.id
所做的那样),您需要使用该字段定义一个类。我想这听起来像是在谈论
映射?这就是你想要做的吗?如果是这样的话,那么它的伸缩性不是很强,最好是在
案例类中显式定义字段,而不是让任何人把东西扔到映射中。没有案例类obj有什么办法吗?我只是为了说明目的添加了它。如果您想使用
操作符从对象中获取属性(就像您对
x.id
所做的那样),您需要使用该字段定义一个类。我想这听起来像是在谈论
映射?这就是你想要做的吗?如果是这样的话,那么最好在
case类中显式定义字段,而不是让任何人把东西扔到map中。或者只:
templates.map(-“其他”)
或者只:
templates.map(-“其他”)