Scala概述(四)操作也是對象(4、5)

4.4.  序列(Sequences

高階函數的使用是序列處理時的一個普遍特點。Scala類庫定義了幾種不同類型的序列:數組(arrays)、列表(lists)、流(streams)和迭代器(iterators)。所有的序列都繼承自特徵(trait):Scala.Seq;從而都定義了一套方法使得相應處理更簡介、高效。例如:map方法將一個函數應用於一個序列的所有元素,產生一個以相應結果爲元素的序列。另一個例子是filter方法,將一個斷言(predicate)函數應用於所有的元素,產生一個由所有使該斷言爲真的元素組成的序列。

下面這個sqrts函數展示了上述兩個方法的使用,它以一個雙精度浮點數的列表xs爲參數,返回一個以其所有非負元素的平方根爲元素的列表:

def sqrts(xs: List[double]): List[double] =

xs filter (0 <=) map Math.sqrt

注意,Math.sqrt是一個Java函數,但它可以與Scala定義的函數一樣的方式作爲參數傳遞給高階函數。

4.5.    For Comprehensions

Scala有一些特殊的語法用於更自然的表示某些特定的高階函數的組合,其中for comprehensions就是對Haskell等語言中的list comprehensions進一步泛化。用for comprehensions寫的sqrts如下:

def sqrts(xs: List[double]): List[double] =

for (val x <- xs; 0 <= x) yield Math.sqrt(x)

這裏,val x <- xs是一個生成器(generator),產生一個序列,而0<=x是一個過濾器(filter),從前者產生的序列中根據某些條件過濾掉一些元素。這個comprehension返回另一個由yield子句所產生的數值構成的序列。一個comprehension可以有多個生成器。

For comprehension對應於mapflatMapfilter等高階方法的組合,上面這個使用for comprehension實現的sqrts4.4節那個實現是相同的。

For comprehension的主要優勢在於它並不受特定數據類型的限制,任何定義了mapflatMapfilter方法的類型都可以使用它,包括所有序列類型(2)、選項值(optional values)和數據庫接口以及一些其他類型。用戶還可以將for comprehension用於自定義類型,只要定義和實現了相關方法。

Scala中,For循環與comprehensions類似,對應於foreachfilter的組合。例如:列表1當中的for循環:for (val arg <- args) ...對應於args foreach (arg => ...)



2數組類型尚未實現序列的全部方法,因爲某些方法需要運行時類型,這一功能尚未實現

發佈了16 篇原創文章 · 獲贊 1 · 訪問量 2190
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章