Scala Collection Method

  • 接收一元函數

    • map 轉換元素,主要應用于不可變集合

      (1 to 10).map(i => i * i)
      (1 to 10).flatMap(i => (1 to i).map(j => i * j))
      
    • transformmap 相同,不過用于可變集合,直接轉換

      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
      
    • scanLeftscanRight 結合了 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...

    • 可使用 seqtoArray 等方法將集合還原

    • 部分方法不能并發操作

      • 使用 reduce 替代 reduceLeft,先對各部分集合操作,然后聚合結果,但操作必須滿足結合律
      • 使用 aggregate 替代 foldLeft,先對各部分集合操作,然后用另一個操作將結果聚合
          str.par.aggregate(Set[Char]())(_ + _, _ ++ _)
          // 等價于
          str.foldLeft(Set[Char]())(_ + _)
          ```
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,572評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,071評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,409評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,569評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,360評論 6 404
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,895評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 42,979評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,123評論 0 286
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,643評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,559評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,742評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,250評論 5 356
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 43,981評論 3 346
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,363評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,622評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,354評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,707評論 2 370

推薦閱讀更多精彩內容