天天看點

Scala基礎入門-3學習Scala——映射和元組

映射和和元組,也就是Maps和Tuples。Map這東西應該都挺明白的,就是鍵值對的集合。而元組,tuple,這東西并不是每個語言都有(Python中是有的,不過當時學的時候沒有完全厘清楚)。

在Scala中,元組是n個對象的一個聚集(Map是n=2個對象的聚集),裡面的内容不需要都是相同類型的。

在Scala中,Map是對偶(算是鍵值對的另一個說法吧)的集合。->操作符用來建立對偶,"Alice" -> 10産出 ("Alice", 10)。

然後說說Scala中兩個集合包的差別。在scala.collention.mutable包中的集合都是内容可變的,也就是建立了集合之後,集合的内容是可以變化的;而scala.collection.immutable包中,集合的内容是不可變的。由于擁抱函數式的緣故,預設都是使用immutable包。

  

如果Map中沒有包含這個鍵值對,會抛出一個異常。用 contains()方法來檢查是否包含指定的鍵。

val bobsScore = if (scores.contains("Bob")) scores("Bob") else 0

由于這個使用方法很多,是以有一個更加快捷的寫法:

val bobsScore = scores.getOrElse("Bob", 0)

如果說像Java中,使用 map.get("Bob"),會如何?會傳回一個Option對象,要麼是Some,要麼是None。關于Option,以後介紹…

對于可變的Map,更改某個已有的值,或者是添加一個沒有的對偶,都是如下:

scores("Fred") = 7

想要添加多個對偶,則使用+=操作:

scores += ("Bob" -> 10, "Fred" -> 7)

移除某個對偶使用-=:

scores -= "Alice"

對不可變的Map來說,操作基本都會是傳回一個新的Map:

// 擷取一個添加了新對偶的Map

val newScores = scores + ("Bob" -> 10, "Fred" -> 7)

// 擷取一個移除了對偶的Map

val newScores = scores - "Alice"

不需要擔心這種操作的效率會很低,新舊Map共享大部分的結構。

for ((k, v) <- map)

// 單獨拿出鍵

for (k <- map.keySet)

// 單獨拿出值

for (v <- map.values)

在這裡我知道了映射的實作方式通常是哈希表或者是一個平衡樹。預設用的都是哈希表。如果需要一個排序的映射,就需要使用樹形映射了。使用scala.collection.immutable.SortedMap即可。

不過Scala中并沒有可變的樹形映射,需要的時候使用Java中的TreeMap。

如果要按照插入的順序通路所有鍵值,可以使用scala.collection.mutable.LinkedHashMap。

與數組中類似,引入函數後就可以觸發轉換。

元組是不同類型的值的聚集。

有了這個,可以友善地傳回多個值,讓我想起了Go。

看代碼:

fRom:http://nerd-is.in/2013-08/scala-learning-maps-and-tuples/