新聞中心
本節(jié)接著上一節(jié)的內(nèi)容,繼續(xù)介紹Scala編程中一些更特征:List(數(shù)組)和Tuple(元組)。

錫林郭勒盟網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)建站!從網(wǎng)頁設(shè)計、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、響應(yīng)式網(wǎng)站等網(wǎng)站項目制作,到程序開發(fā),運營維護。創(chuàng)新互聯(lián)建站2013年開創(chuàng)至今到現(xiàn)在10年的時間,我們擁有了豐富的建站經(jīng)驗和運維經(jīng)驗,來保證我們的工作的順利進行。專注于網(wǎng)站建設(shè)就選創(chuàng)新互聯(lián)建站。
編輯推薦:Scala編程語言專題
Scala中使用List
方法不應(yīng)該有副作用是函數(shù)風(fēng)格編程的一個很重要的理念。方法唯一的效果應(yīng)該是計算并返回值。用這種方式工作的好處就是方法之間很少糾纏在一起,因此就更加可靠和可重用。另一個好處(靜態(tài)類型語言里)是傳入傳出方法的所有東西都被類型檢查器檢查,因此邏輯錯誤會更有可能把自己表現(xiàn)為類型錯誤。把這個函數(shù)式編程的哲學(xué)應(yīng)用到對象世界里意味著使對象不可變。
如你所見,Scala數(shù)組是一個所有對象都共享相同類型的可變序列。比方說Array[String]僅包含String。盡管實例化之后你無法改變Array的長度,它的元素值卻是可變的。因此,Array是可變的對象。
說到共享相同類型的不可變對象序列,Scala的List類才是。和數(shù)組一樣,List[String]包含的僅僅是String。Scala的List,scala.List,不同于Java的java.util.List,總是不可變的(而Java的List可變)。更通常的說法,Scala的List是設(shè)計給函數(shù)式風(fēng)格的編程用的。
創(chuàng)建一個List很簡單。代碼3.3做了展示:
- val oneTwoThree = List(1, 2, 3)
代碼 3.3 創(chuàng)造和初始化列表
代碼3.3中的代碼完成了一個新的叫做oneTwoThree的val,并已經(jīng)用帶有整數(shù)元素值1,2和3的新List[Int]初始化。 因為List是不可變的,他們表現(xiàn)得有些像Java的String:當(dāng)你在一個List上調(diào)用方法時,似乎這個名字指代的List看上去被改變了,而實際上它只是用新的值創(chuàng)建了一個List并返回。比方說,List有個叫“:::”的方法實現(xiàn)疊加功能。你可以這么用:
- val oneTwo = List(1, 2)
- val threeFour = List(3, 4)
- val oneTwooneTwoThreeFour = oneTwo ::: threeFour
- println(oneTwo + " and " + threeFour + " were not mutated.")
- println("Thus, " + oneTwoThreeFour + " is a new List.")
如果你執(zhí)行這個腳本,你會看到:
- List(1, 2) and List(3, 4) were not mutated.
- Thus, List(1, 2, 3, 4) is a new List.
或許List最常用的操作符是發(fā)音為“cons”的‘::’。Cons把一個新元素組合到已有List的最前端,然后返回結(jié)果List。例如,若執(zhí)行這個腳本:
- val twoThree = list(2, 3)
- val oneTwoThree = 1 :: twoThree
- println(oneTwoThree)
你會看到:
- List(1, 2, 3)
注意
表達式“1 :: twoThree”中,::是它右操作數(shù),列表twoThree,的方法。你或許會疑惑::方法的關(guān)聯(lián)性上有什么東西搞錯了,不過這只是一個簡單的需記住的規(guī)則:如果一個方法被用作操作符標(biāo)注,如a * b,那么方法被左操作數(shù)調(diào)用,就像a.*(b)——除非方法名以冒號結(jié)尾。這種情況下,方法被右操作數(shù)調(diào)用。因此,1 :: twoThree里,::方法被twoThree調(diào)用,傳入1,像這樣:twoThree.::(1)。
5.8節(jié)中將描述更多操作符關(guān)聯(lián)性的細(xì)節(jié)。
由于定義空類的捷徑是Nil,所以一種初始化新List的方法是把所有元素用cons操作符串起來,Nil作為最后一個元素。
比方說,下面的腳本將產(chǎn)生與之前那個同樣的輸出
- “List(1, 2, 3)”:
- val oneTwoThree = 1 :: 2 :: 3 :: Nil
- println(oneTwoThree)
Scala的List包裝了很多有用的方法,表格3.1羅列了其中的一些。列表的全部實力將在第十六章釋放。
為什么列表不支持append?
類List沒有提供append操作,因為隨著列表變長append的耗時將呈線性增長,而使用::做前綴則僅花費常量時間。如果你想通過添加元素來構(gòu)造列表,你的選擇是把它們前綴進去,當(dāng)你完成之后再調(diào)用reverse;或使用ListBuffer,一種提供append操作的可變列表,當(dāng)你完成之后調(diào)用toList。ListBuffer將在22.2節(jié)中描述。
Scala中使用Tuple
另一種有用的容器對象是元組:tuple。與列表一樣,元組也是不可變的,但與列表不同,元組可以包含不同類型的元素。而列表應(yīng)該是List[Int]或List[String]的樣子,元組可以同時擁有Int和String。元組很有用,比方說,如果你需要在方法里返回多個對象。Java里你將經(jīng)常創(chuàng)建一個JavaBean樣子的類去裝多個返回值,Scala里你可以簡單地返回一個元組。而且這么做的確簡單:實例化一個裝有一些對象的新元組,只要把這些對象放在括號里,并用逗號分隔即可。一旦你已經(jīng)實例化了一個元組,你可以用點號,下劃線和一個基于1的元素索引訪問它。代碼3.4展示了一個例子:
- val pair = (99, "Luftballons")
- println(pair._1)
- println(pair._2)
代碼 3.4 創(chuàng)造和使用元組
代碼3.4的第一行,你創(chuàng)建了元組,它的第一個元素是以99為值的Int,第二個是"luftballons"為值的String。Scala推斷元組類型為Tuple2[Int, String],并把它賦給變量pair。第二行,你訪問_1字段,從而輸出第一個元素,99。第二行的這個“.”與你用來訪問字段或調(diào)用方法的點沒有區(qū)別。本例中你正用來訪問名叫_1的字段。如果執(zhí)行這個腳本,你能看到:
- 99
- Luftballons
元組的實際類型取決于它含有的元素數(shù)量和這些元素的類型。因此,(99, "Luftballons")的類型是Tuple2[Int, String]。('u', 'r', 'the', 1, 4, "me")是Tuple6[Char, Char, String, Int, Int, String]。
訪問元組的元素
你或許想知道為什么你不能像訪問List里的元素那樣訪問元組的,就像pair(0)。那是因為List的apply方法始終返回同樣的類型,但是元組里的或許類型不同。_1可以有一個結(jié)果類型,_2是另外一個,諸如此類。這些_N數(shù)字是基于1的,而不是基于0的,因為對于擁有靜態(tài)類型元組的其他語言,如Haskell和ML,從1開始是傳統(tǒng)的設(shè)定。
本文節(jié)選自《Programming in Scala》
【相關(guān)閱讀】
- Scala編程實例:帶類型的參數(shù)化數(shù)組
- 初探Scala編程:編寫腳本,循環(huán)與枚舉
- 初探Scala編程:解釋器,變量及函數(shù)定義
- 影響Scala語言設(shè)計的因素列表
- 喜歡Scala編程的四個理由
分享名稱:Scala編程實例:使用List和Tuple
標(biāo)題來源:http://www.dlmjj.cn/article/djedoce.html


咨詢
建站咨詢
