成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Scala編程實例:使用Set和Map

開發 后端
本文節選自Martin Odersky,Lex Spoon和Bill Venners所著,Regular翻譯的《Programming in Scala》的第二章。Scala是一種針對 JVM 將函數和面向對象技術組合在一起的編程語言。

因為Scala致力于幫助你充分利用函數式和指令式風格兩方面的好處,它的集合類型庫于是就區分了集合類的可變和不可變。例如,數組始終是可變的,而列表始終不可變。當問題討論到集和映射,Scala同樣提供了可變和不可變的替代品,不過用了不同的辦法。對于集和映射,Scala把可變性建模在類繼承中。

51CTO編輯推薦:Scala編程語言專題

例如,Scala的API包含了集的一個基本特質:trait,特質這個概念接近于Java的接口。Scala于是提供了兩個子特質,一個是可變的集,另一個是不可變的集。就如你在圖3.2里會看到的,這三個特質都共享同樣的簡化名,Set。然而它們的全稱不一樣,因為每個都放在不同的包里。Scala的API里具體的Set類,如圖3.2的HashSet類,擴展了要么是可變的,要么不可變的Set特質。(盡管Java里面稱為“實現”了接口,在Scala里面稱為“擴展”或“混入”了特質。)因此,如果你想要使用HashSet,你可以根據你的需要選擇可變的或不可變的變體。創造集的缺省方法展示在代碼3.5中:

  1. var jetSet = Set("Boeing", "Airbus")  
  2. jetSet += "Lear"  
  3. println(jetSet.contains("Cessna"))  

代碼 3.5 創造,初始化,和使用不可變集

代碼3.5的第一行代碼里,定義了名為jetSet的新var,并使用了包含兩個字串,"Boeing"和"Airbus"的不可變集完成了初始化。就像例子中展示的,Scala中創建集的方法與創建列表和數組的類似:通過調用Set伴生對象的名為apply的工廠方法。代碼3.5中,對scala.collection.immutable.Set的伴生對象調用了apply方法,返回了一個缺省的,不可變Set的實例。Scala編譯器推斷jetSet的類型為不可變Set[String]。

Scala的Set類繼承關系 

要向集加入新的變量,可以在集上調用+,傳入新的元素。可變的和不可變的集都提供了+方法,但它們的行為不同。可變集將把元素加入自身,不可變集將創建并返回一個包含了添加元素的新集。代碼3.5中,你使用的是不可變集,因此+調用將產生一個全新集。因此盡管可變集提供的實際上是+=方法,不可變集卻不是。本例中,代碼的第二行,“jetSet += "Lear"”,實質上是下面寫法的簡寫:

  1. jetSetjetSet = jetSet + "Lear"  

因此在代碼3.5的第二行,你用一個包含了"Boeing","Airbus"和"Lear"的新集重新賦值了jetSet這個var。最終,代碼3.5的最后一行打印輸出了集是否包含字串"Cessna"。(正如你所料到的,輸出false。)

如果你需要不可變集,就需要使用一個引用:import,如代碼3.6所示:

  1. import scala.collection.mutable.Set  
  2. val movieSet = Set("Hitch", "Poltergeist")  
  3. movieSet += "Shrek"  
  4. println(movieSet) 

代碼 3.6 創建,初始化,和使用可變集

代碼3.6的第一行里引用了可變Set。就像Java那樣,引用語句允許你使用簡單名,如Set,以替代更長的,全標識名。結果,當你在第三行寫Set的時候,編譯器就知道你是指scala.collection.mutable.Set。在那行里,你使用包含字串"Hitch"和"Poltergeist"的新可變集初始化了movieSet。下一行通過在集上調用+=方法向集添加了"Shrek"。正如前面提到的,+=是實際定義在可變集上的方法。如果你想的話,你可以替換掉movieSet += "Shrek"的寫法,寫成movieSet.+=("Shrek")。

盡管目前為止看到的通過可變和不可變的Set工廠方法制造的缺省的集實現很可能能夠滿足極大多數的情況,但偶爾你也或許想要個顯式的集類。幸運的是,語法是相同的。只要引用你需要的類,并使用它伴生對象的工廠方法即可。例如,如果你需要一個不可變的HashSet,你可以這么做:

  1. import scala.collection.immutable.HashSet  
  2. val hashSet = HashSet("Tomatoes", "Chilies")  
  3. println(hashSet + "Coriander") 


Map是Scala里另一種有用的集合類。和集一樣,Scala采用了類繼承機制提供了可變的和不可變的兩種版本的Map,你能在圖3.3里看到,Map的類繼承機制看上去和Set的很像。scala.collection包里面有一個基礎Map特質和兩個子特質Map:可變的Map在scala.collection.mutable里,不可變的在scala.collection.immutable里。

Map的實現,如顯示在類繼承圖3.3里的HashMap,擴展了要么可變,要么不可變特質。你可以使用與那些用在數組,列表和集中的一樣的工廠方法去創造和初始化映射。例如,代碼3.7展示了可變映射的創造過程:

  1. import scala.collection.mutable.Map  
  2. val treasureMap = Map[Int, String]()  
  3. treasureMap += (1 -> "Go to island.")  
  4. treasureMap += (2 -> "Find big X on ground.")  
  5. treasureMap += (3 -> "Dig.")  
  6. println(treasureMap(2))  

代碼 3.7 創造,初始化,和使用可變映射

Scala的Map類繼承關系 
 
代碼3.7的第一行里,你引用了可變形式的Map。然后就定義了一個叫做treasureMap的val并使用空的包含整數鍵和字串值的可變Map初始化它。映射為空是因為你沒有向工廠方法傳遞任何值(“Map[Int, String]()”的括號里面是空的)。 下面的三行里你使用->和+=方法把鍵/值對添加到Map里。像前面例子里演示的那樣,Scala編譯器把如1 -> "Go to island"這樣的二元操作符表達式轉換為(1).->("Go to island.")。因此,當你輸入1 -> "Go to island.",你實際上是在值為1的Int上調用->方法,并傳入值為"Go to island."的String。這個->方法可以調用Scala程序里的任何對象,并返回一個包含鍵和值的二元元組。 然后你在把這個元組傳遞給treasureMap指向的Map的+=方法。最終,最后一行輸出打印了treasureMap中的與鍵2有關的值。如果你執行這段代碼,將會打印:

  1. Find big X on ground. 

如果你更喜歡不可變映射,就不用引用任何類了,因為不可變映射是缺省的,代碼3.8展示了這個例子:

  1. val romanNumeral = Map(  
  2.  1 -> "I", 2 -> "II", 3 -> "III", 4 -> "IV", 5 -> "V"  
  3. )  
  4. println(romanNumeral(4))  

代碼 3.8 創造,初始化,和使用不可變映射

由于沒有引用,當你在代碼3.8的第一行里提及Map時,你會得到缺省的映射:scala.collection.immutable.Map。傳給工廠方法入五個鍵/值元組,返回包含這些傳入的鍵/值對的不可變Map。如果你執行代碼3.8中的代碼,將會打印輸出IV。

本文節選自《Programming in Scala》

【相關閱讀】

  1. Scala編程實例:使用List和Tuple
  2. Scala編程實例:帶類型的參數化數組
  3. 初探Scala編程:編寫腳本,循環與枚舉
  4. 初探Scala編程:解釋器,變量及函數定義
  5. 影響Scala語言設計的因素列表
責任編輯:楊鵬飛 來源: Artima
相關推薦

2009-07-09 00:25:00

ScalaListTuple

2009-07-09 00:25:00

Scala參數化

2024-11-11 17:20:52

2010-09-14 15:34:41

Scala

2010-11-17 11:31:22

Scala基礎面向對象Scala

2009-09-18 11:44:05

Scala實例教程Kestrel

2020-12-29 06:44:18

GoScala編程語言

2010-09-14 13:22:17

Scala編程指南Scala

2011-07-18 15:32:14

iPhone 錄音 播放

2020-07-12 15:34:48

JavaScript開發技術

2009-09-28 11:42:21

KestrelScala

2009-10-21 15:10:27

Scala Actor

2009-07-08 16:10:24

Scala簡介面向對象函數式

2020-12-09 18:36:28

ObjectArrayJavaSc

2009-09-24 09:41:00

Scala講座Scala

2010-10-14 13:50:11

Scala

2010-03-11 10:34:22

Scala

2011-06-28 11:06:16

Scala

2009-09-28 10:26:12

Scala代碼實例Kestrel

2009-06-17 13:57:25

Scala元組數組
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久成人一区 | 久久久久国产一区二区三区 | 99热首页 | 国产精品一区在线观看 | 中文字幕在线观看 | 免费看a | 亚洲精品电影网在线观看 | 欧美 中文字幕 | 9色视频在线 | 成年人免费网站 | 欧美一区二区在线看 | 国产精品福利网站 | 国产一区二区三区在线视频 | 怡红院成人在线视频 | 欧美在线观看免费观看视频 | 免费午夜剧场 | 成人免费视屏 | 91成人免费电影 | 久久伊人一区二区 | 麻豆av在线 | 久久97精品 | 波多野结衣精品在线 | 欧美在线日韩 | 中文字幕在线二区 | 在线一区二区三区 | 亚洲 一区 | 亚洲欧美日韩在线不卡 | 欧美在线视频网 | 在线观看日本高清二区 | 精品麻豆剧传媒av国产九九九 | 精品国产乱码久久久久久果冻传媒 | 羞羞视频网 | 中文字幕亚洲欧美 | 日韩在线观看中文字幕 | 做a视频 | 国产精品久久久久久久久久久免费看 | 日本天堂视频在线观看 | 91久久久久久 | 久久之精品 | 国产一区二区精华 | 日韩成人在线电影 |