Scala - 从地图中高效地提取列表
Scala - Extract a list efficiently from a map
我有一个大 json 对象:myNestedObject
{
"size": 2,
"values": [{
"name": "mullock",
"upstatus": "Green",
"details": {
"key": "rupture farms",
"server": "mudos",
"owner": "magog_cartel",
"type": "NORMAL",
"links": {
"self": [{
"address": "https://mudos.com:port/access"
}]
}
}
},{
"name": "tassadar",
"upstatus": "Orange",
"details": {
"key": "archon",
"server": "protoss",
"owner": "aspp67",
"type": "NORMAL",
"links": {
"self": [{
"address": "https://aiur.com:port/access"
}]
}
}
}],
"limit": 100
}
这就是案例类的样子如下:
import com.fasterxml.jackson.databind.ObjectMapper
import com.fasterxml.jackson.module.scala.DefaultScalaModule
import com.fasterxml.jackson.module.scala.experimental.ScalaObjectMapper
case class Result(size: Int, limit: Int, values: Seq[Values])
case class Values(name: String, upstatus: String, details: ValuesDetails)
case class ValuesDetails(key: String, server: String, owner: String, `type`: String, links: ValuesDetailsLinks)
case class ValuesDetailsLinks(self: Seq[ValuesDetailsLinksAddress])
case class ValuesDetailsLinksAddress(address: String)
object Foo {
val mapper = new ObjectMapper() with ScalaObjectMapper
mapper.registerModule(DefaultScalaModule)
def test(Json): Unit
val return = mapper.readValue[Result](Json)
myNestedObject.size
是给出数组长度的字段
myNestedObject.values(i)
正在尝试将以下值提取到列表[String]
myNestedObject.values(i).name
我一直在使用粗略的 for 循环来提取并且代码有效。
val selectNames: List[String] = (
for (i <- 0 to myNestedObject.size-1 toList) yield
myNestedObject.values(i).name
)
重构我的代码并尝试使用 .map(未成功)做同样的事情,两次尝试:
myNestedObject.map(_ => values(i).name)
myNestedObject.(values(i).name).asInstanceOfList
免责声明:我对此完全是新手。
解决方案:无需指定索引即可访问值列表
myNestedObject.values.map(_.name)
我认为你可以这样做:
myNestedObject.values.map(_.name)
Dylan Grald 的回答是正确的,但您也可以使用等效的 for-comprehension
for (x <- myNestedObject.values)
yield (x.name)
这会使用 map
方法对版本进行脱糖。对于像这样的简单情况,我更喜欢直接调用 map
方法,但我想我会提到 for
版本作为替代方法。
我有一个大 json 对象:myNestedObject
{
"size": 2,
"values": [{
"name": "mullock",
"upstatus": "Green",
"details": {
"key": "rupture farms",
"server": "mudos",
"owner": "magog_cartel",
"type": "NORMAL",
"links": {
"self": [{
"address": "https://mudos.com:port/access"
}]
}
}
},{
"name": "tassadar",
"upstatus": "Orange",
"details": {
"key": "archon",
"server": "protoss",
"owner": "aspp67",
"type": "NORMAL",
"links": {
"self": [{
"address": "https://aiur.com:port/access"
}]
}
}
}],
"limit": 100
}
这就是案例类的样子如下:
import com.fasterxml.jackson.databind.ObjectMapper
import com.fasterxml.jackson.module.scala.DefaultScalaModule
import com.fasterxml.jackson.module.scala.experimental.ScalaObjectMapper
case class Result(size: Int, limit: Int, values: Seq[Values])
case class Values(name: String, upstatus: String, details: ValuesDetails)
case class ValuesDetails(key: String, server: String, owner: String, `type`: String, links: ValuesDetailsLinks)
case class ValuesDetailsLinks(self: Seq[ValuesDetailsLinksAddress])
case class ValuesDetailsLinksAddress(address: String)
object Foo {
val mapper = new ObjectMapper() with ScalaObjectMapper
mapper.registerModule(DefaultScalaModule)
def test(Json): Unit
val return = mapper.readValue[Result](Json)
myNestedObject.size
是给出数组长度的字段
myNestedObject.values(i)
正在尝试将以下值提取到列表[String]
myNestedObject.values(i).name
我一直在使用粗略的 for 循环来提取并且代码有效。
val selectNames: List[String] = (
for (i <- 0 to myNestedObject.size-1 toList) yield
myNestedObject.values(i).name
)
重构我的代码并尝试使用 .map(未成功)做同样的事情,两次尝试:
myNestedObject.map(_ => values(i).name)
myNestedObject.(values(i).name).asInstanceOfList
免责声明:我对此完全是新手。
解决方案:无需指定索引即可访问值列表
myNestedObject.values.map(_.name)
我认为你可以这样做:
myNestedObject.values.map(_.name)
Dylan Grald 的回答是正确的,但您也可以使用等效的 for-comprehension
for (x <- myNestedObject.values)
yield (x.name)
这会使用 map
方法对版本进行脱糖。对于像这样的简单情况,我更喜欢直接调用 map
方法,但我想我会提到 for
版本作为替代方法。