List 如何在scala中保留列表[T]的一些键值对?
我有一个列表[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
[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(-“其他”)