-
接收一元函數
-
map
轉換元素,主要應用于不可變集合(1 to 10).map(i => i * i) (1 to 10).flatMap(i => (1 to i).map(j => i * j))
-
transform
與map
相同,不過用于可變集合,直接轉換ArrayBuffer("Peter", "Paul", "Mary").transform(_.toUpperCase)
-
collect
接收偏函數(PartialFunction
)作為參數;模式匹配也是一種偏函數"-3+4".collect { case '+' => 1 ; case '-' => -1 } // Vector(-1, 1)
-
groupBy
按指定函數分組,返回Map
val words = Array("Abc", "ab") val map = words.groupBy(_.substring(0, 1).toUpperCase) // Map(A -> Array(Abc, ab))
-
-
接收二元函數
-
reduceLeft
從左向右規約f(f(f(a, b), c), d)
List(1, 7, 2, 9).reduceLeft(_ - _) // ((1 - 7) - 2) - 9 = 1 - 7 - 2 - 9 = -17
-
reduceRight
從右向左規約f(a, f(b, f(c, d)))
List(1, 7, 2, 9).reduceRight(_ - _) // 1 - (7 - (2 - 9)) = 1 - 7 + 2 - 9 = -13
-
foldLeft
提供初始值+二元函數,從左向右折疊,每次計算結果在左側- 可用
/:
(表示樹形左側)操作符表示,(init /: collection)(function)
- 可用
-
foldRight
提供初始值+二元函數,從右向左折疊,每次計算結果在右側- 可用
:\
(表示樹形右側)操作符表示,(collection :\ init)(function)
List(1, 7, 2, 9).foldLeft(0)(_ - _) (0 /: List(1, 7, 2, 9))(_ - _) // 0 - 1 - 7 - 2 - 9 = -19
- 可用
-
scanLeft
和scanRight
結合了 folding 和 mapping,結果為所有的中間過程值(1 to 10).scanLeft(0)(_ + _) // Vector(0, 1, 3, 6, 10, 15, 21, 28, 36, 45, 55)
-
-
zip
拉鏈,即將兩個集合各個元素像拉鏈一樣交叉結合在一起List(1,2,3) zip List("a","b","c") // List((1,a), (2,b), (3,c))
- 長度不一致的集合則以較小的長度為準
-
zipAll
為長度較短的集合設置默認值,this.zipAll(that, thisDefault, thatDefault)
-
zipWithIndex
返回元素及對應的下標"Scala".zipWithIndex // Vector((S,0), (c,1), (a,2), (l,3), (a,4))
-
view
為集合創建延遲視圖val lazyView = (1 to 1000000).view lazyView.take(100).last //100
- 對視圖的操作都不會立即計算(包括第一個元素也不會)
- 與
Stream
不同,不會緩存任何值 -
apply
方法會強制計算整個視圖,使用lazyView.take(i).last
代替lazyView(i)
-
par
并行化集合,后續應用的方法都會并發計算for (i <- (0 until 100).par) print(s" $i") // 1-99
很好的解決并發編程問題
將集合變為對于的并行化實現
對于產生的結果,與串行方式的結果一致 (如
for...yield...
)可使用
seq
,toArray
等方法將集合還原-
部分方法不能并發操作
- 使用
reduce
替代reduceLeft
,先對各部分集合操作,然后聚合結果,但操作必須滿足結合律 - 使用
aggregate
替代foldLeft
,先對各部分集合操作,然后用另一個操作將結果聚合
str.par.aggregate(Set[Char]())(_ + _, _ ++ _) // 等價于 str.foldLeft(Set[Char]())(_ + _) ```
- 使用
Scala Collection Method
?著作權歸作者所有,轉載或內容合作請聯系作者
- 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
- 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
- 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
推薦閱讀更多精彩內容
- //Clojure入門教程: Clojure – Functional Programming for the J...
- 寫在前面的話 代碼中的# > 表示的是輸出結果 輸入 使用input()函數 用法 注意input函數輸出的均是字...