Scala入門(2)

1 函數式編程思想

  • 純函數,沒有副作用
    即沒有諸如修改全局變量、拋出異常、IO讀寫和調用有副作用的函數等狀態變化
  • 參數和函數體都是引用透明
    即對於相同的輸入,總是得到相同的輸出。反例:append函數。
    爲了獲得引用透明性,任何值都不能變化。
  • 函數是一等公民
    Scala中函數就像普通變量一樣,同樣也具有函數的類型。
    在這裏插入圖片描述
  • 高階函數:用函數作爲形參或返回值的函數
  • 閉包

2 語言基礎

2.1 變量

val、 var、 lazy val
注:當定義的變量可能後續不會用到時可使用lazy val

2.2 數據類型

在這裏插入圖片描述

  • Unit:表示空,val x:Unit=(),val x=()
  • Null:scala中通常不會使用null而是使用option
  • Nothing:表示程序異常中止,若一個函數返回nothing表明該函數發生異常
  • String:支持字符串插值,用${name}可在字符串裏引入name這個變量代表的字符串

2.3 函數與代碼塊

2.3.1 代碼塊

代碼塊Block是表達式,最終的值是最後一個表達式的值,Block有兩種表達方式:

  • {exp1;exp2}
  • {
    exp1
    exp2
    }

2.3.2 函數

在這裏插入圖片描述

  • 只有一個表達式的時候可以去掉花括號
  • 有些簡單的表達式scala會自動推斷出返回類型

2.4 if與for

2.4.1 if

if (lofical_exp) valA
if (lofical_exp) valA else valB·

2.4.2 for

是實現循環的推導式,本質是scala的函數向Map、Reduce組合而實現的,是scala的語法糖的一種。
在這裏插入圖片描述

2.5 try與match表達式

2.5.1 try

try是表達式,會返回一個值
在這裏插入圖片描述

2.5.2 match

類似c++的switch
在這裏插入圖片描述

3 求值策略

scala中所有運算都是基於表達式。默認是call by value,函數調用前會對實參中所有的表達式進行求值。
在這裏插入圖片描述
舉個栗子:
在這裏插入圖片描述
在這裏插入圖片描述

4 高階函數

4.1 函數與匿名函數

  • 函數類型:A=>B,表示一個接受類型A的參數,並返回類型B的函數
  • 高階函數:用函數作爲形參或返回值的函數
  • 匿名函數:函數常量,格式爲:{形參列表}=>{函數體}
    例:(x:Int, y:Int) => x + y

4.2 柯里化

把具有多個參數的函數轉換爲一條函數鏈,每個節點是單一參數
在這裏插入圖片描述
在這裏插入圖片描述

4.3 遞歸與尾遞歸

在函數式編程中,所有的循環都是通過遞歸實現。
在這裏插入圖片描述
遞歸層數多,容易造成堆棧溢出。爲了解決這個問題,於是出現了尾遞歸。
在這裏插入圖片描述
舉個栗子:
在這裏插入圖片描述
在這裏插入圖片描述

5 Collections-list基本使用

在這裏插入圖片描述

5.1 List[T]

val a=List(1,2,3,4)
val b=0::a
val c="x"::"y"::Nil
val d=a:::c
a.head //返回當前List的第一個元素
a.tail //返回當前List除了第一個元素外剩下元素組成的列表
a.isEmpty
Nil,Empty

在這裏插入圖片描述

List的高階函數

在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

  • 參數都是匿名函數
  • takeWhile遍歷到False時就停止了
  • 區分map與flatMap

6 集合的歸約操作

6.1 reduceLeft

在這裏插入圖片描述

6.2 foldLeft 更通用

在這裏插入圖片描述

6.3 Rang與Stream

在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

6.4 tuple與map

在這裏插入圖片描述
在這裏插入圖片描述

在這裏插入圖片描述
舉個栗子:實現快速排序,每次取元素爲a.head,把小於a.head放在前面,大於的放在後面。
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章