我有一个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和名称值对之外一切都被清除?
答案 0 :(得分:1)
除非您想要仅使用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)
这是“定义另一个类”选项:
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")
,如果密钥不存在,则会返回一个选项并且不会以异常结束。