有趣的Scala列表
Scala的列表結構可以理解為一個樣例類,因為它不需要使用new方法,例如:
除了這種方法構建列表外,還可以使用::符號構建
其中Nil表示空列表,::符號表示在列表前面追加元素,所以如果沒有後面的Nil,Scala就會報錯。
列表不同於數組Array,它是鏈表結構。並且列表元素必須要是同樣的類型,如果列表裡混用其它類型,那麼它們的類型默認為Any類。所有類型的父類。
有趣的一點在於,如果類型S是類型T的子類,那麼List[S]也是List[T]的子類。這也是為什麼下面的例子可以成立,因為空列表List[Nothing]是所有類型的子類,那麼也是List[T]的子類型。
Scala的列表核心是三個方法:head(返回首元素),tail(除首元素以外的元素),isEmpty(判斷是否為空)。
Scala的列表可以利用模式匹配實現和Python一樣的解包
當然如果你不確定元素數量的話,可以利用列表構建符號::去匹配元素,沒有匹配上的元素都會變成列表賦給rest。
下面聊下Scala列表的初階方法和高階方法,兩者的區別僅在於初階方法不接受函數作為參數傳入,高階可以。
列表的拼接,使用:::符號
用模式匹配去看待列表拼接可以理解為:
只不過這裡的concat定義的是函數,而不是列表的中綴方法。
對應head和tail方法,還用init和last方法
init方法返回除末尾元素外的列表,last返回最後一個元素,顯然對於鏈表結構,它們的運算量都是O(n)級別的
map、foreach,filter
map函數很出名了,對列表每個元素做處理
foreach和map很類似,不過需要傳入的是返回為Unit的函數
filter則是過濾元素
TAG:鴻的學習筆記 |