Scala Map 使用方法

2019-05-12 19:30:56 | 编辑 | 添加

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)。