Map是无序,键可以重复值不可以重复的键值对集合
假设我们要存储人对应的网址,我们可以将其以键值对的形式存储在
Map 中。
val feeds = Map( "Andy Hunt" -> "blog.toolshed.com", "Dave Thomas" -> "pragdave.me", "NFJS" -> "nofluffjuststuff.com/blog")
1 按key和value过滤搜索
按键搜索
val filterNameStartWithD = feeds filterKeys (_ startsWith "D") println(s"# of Filtered: ${filterNameStartWithD.size}")
输出结果:
# of Filtered: 1
我们还可以使用filter()方法。提供给filter()方法的函数值接收一个(键,值)元组,我们可以像下面这样使用它:
val filterNameStartWithDAndPragprogInFeed = feeds filter { element => val (key, value) = element (key startsWith "D") && (value contains "pragdave") } print("# of feeds with auth name D* and pragdave in URL: ") println(filterNameStartWithDAndPragprogInFeed.size)
输出结果:
# of feeds with auth name D* and pragdave in URL: 1
2 获取值 get 和 apply
使用get()方法。因为对于给定的键,其对应的值可能不存在,所以get()方法的返回类型是Option[T],该方法的实际结果要么是一个Some[T]要么是None,其中T 也是Map 的值类型。
println(s"Get Andy's Feed: ${feeds.get("Andy Hunt")}")
我们可以使用apply()方法来获取一个键的值和get()方法不同的是,apply()方法返回的不是Option[T],而是返回的值(即T),确保将代码放置在一个try-catch 代码块中
try { println(s"Get Andy's Feed Using apply(): ${feeds("Andy Hunt")}") print("Get Bill's Feed: ") println(feeds("Bill Who")) } catch { case _: java.util.NoSuchElementException => println("Not found") }
下面是使用 apply()方法的输出结果:
Get Andy's Feed Using apply(): blog.toolshed.com Get Bill's Feed: Not found
3 map添加修改值updated
要添加 元素,请使用updated()方法。因为我们使用的是不可变集合,所以updated()方法不会影响原来的Map。如同其方法名所提示的一样,它会返回一个携带着新元素的全新Map。
val newFeeds1 = feeds.updated("Venkat Subramaniam", "blog.agiledeveloper.com") println("Venkat's blog in original feeds: " + feeds.get("Venkat Subramaniam")) println("Venkat's blog in new feed: " + newFeeds1("Venkat Subramaniam"))
让我们看一下调用 updated()方法之后的效果:
Venkat's blog in original feeds: None Venkat's blog in new feed: blog.agiledeveloper.com
除显式地调用 updated()方法之外,也可以利用另一个Scala 小技巧。如果在赋值语句的左边的类或者实例上使用圆括号,那么 Scala 将自动调用updated()方法。因此,X() =b 等价于X.updated(b)。如果updated()接受多个参数,那么可以将除尾参数之外的所有参数都放置在括号内部。因此,X(a) = b 等价于X.updated(a,b)。