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 版本作为替代方法。