scala中的集合,如何在地图中获取元素

时间:2016-04-26 17:33:53

标签: scala

来自lift-json

scala> val json = parse("""
         {
           "name": "joe",
           "addresses": {
             "address1": {
               "street": "Bulevard",
               "city": "Helsinki"
             },
             "address2": {
               "street": "Soho",
               "city": "London"
             }
           }
         }""")
scala> case class Address(street:String, city: String)
scala> case class PersonWithAddresses(name: String, addresses: Map[String, Address])
scala> val joe = json.extract[PersonWithAddresses]
res0: PersonWithAddresses("joe", Map("address1" -> Address("Bulevard", "Helsinki"),
                                     "address2" -> Address("Soho", "London")))

我想访问joe的元素。我想知道Joe的address1 city。怎么样?

奖金问题: 如果PersonWithAddresses

,该怎么办?
  

case class PersonWithAddress(name:String, addresses: Map[String, List[Address]])

如何提取该列表的大小?

P.S。题: joe.addresses("address1").size()joe.addresses.get("address1").size之间的区别是什么? 0 < x < 1

1 个答案:

答案 0 :(得分:3)

你的问题与json和提升本身没有任何关系。你已经有了自己的对象,你只是不知道如何使用scala集合。

如果没有列表,您可以通过以下方式获取您所在的城市:

@ joe.addresses("address1") 
res4: Address = Address("Bulevard", "Helsinki")
@ res4.city 
res5: String = "Helsinki"

joe.addresses("address1").city简称。

如果是列表

case class PersonWithAddress(name:String, addresses: Map[String, List[Address]])

您只需在列表中拨打size

joe.addresses("address1").size

至于这两者之间的区别:

@ res7.addresses("address1").size 
res8: Int = 1
@ res7.addresses.get("address1").size 
res9: Int = 1

有一个很大的区别,看看你致电get

时会发生什么
@ res7.addresses.get("address1") 
res10: Option[List[Address]] = Some(List(Address("Bulevard", "Helsinki")))

返回Option,可以将其视为0或1的集合。检查其大小不是您想要做的。

map.get("key")

返回Option,如果地图中存在值,则为Some(value),如果不是

,则为None 如果地图中不存在元素,

map("key")或desugared map.apply("key")将返回与键或例外关联的项目。