-
object sortDemo {
?def qSort(a: List[Int]): List[Int] = {
? ?if (a.length < 2) a
? ?else qSort(a.filter(a.head > _)) ++
? ?a.filter(a.head == _) ++
? ?qSort(a.filter(a.head < _))
?}
?def main(args: Array[String]): Unit = {
? ?println(qSort(List(6,4,5,3,1,2,9,8,0)))
?}
}查看全部 -
實現快速排序
查看全部 -
Map
定義一個Map: val p = Map(1 -> "David", 9 -> "Bob")
取出值:p(key), 比如:p(1), p(9)
判斷key是不是在map中: p.contains(key)
取出所有key: p.keys
取出所有值:p.values
添加一個鍵值: p + (8 -> "Tom")
刪除一個鍵值: p - 1
添加多個鍵值對: p ++ List(2-> "Alice", 5 -> "piter")
減去多個鍵值對: p -- List(1, 9, 2)
查看全部 -
Tuple(元組):
定義2個字段的元組? (1,2) 或? 1 ->2
訪問元組中的元素: z._1 (z元組的第一分量)
Map[K,V]:
定義Map?? val? p = Map(1? ->? "David",9 ? ->"Lili")
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? Map(1 -> David, 9 -> Lili)?
p(1)?????? David?? 取p Map 的值
p.contains(1)?? 判斷key在不在? p Map中
p.keys?? 取所有key
p.values? 取所有value
p + ( k -> v)? 添加值
p -? k??? 刪除值
p? ++ List(k -> v ,k -> v)? 添加多個值
p? --? List(k,k)? 減去多個值
查看全部 -
Stream 惰性求值
查看全部 -
Range(整數序列):
生成Range
1 to 10???? Range(1,2,3,4,5,6,7,8,9,10)
1 to 10? by 2??? Range(1,3,5,7,9)
1 until 10? Range(1,2,3,4,5,6,7,8,9)
Stream(惰性求值列表):
列表的第一個值確定,其他值在使用時才會計算
1? #::? 2 #:: 3 #::? Stream.empty ? ? ? ? ? ? ?? Stream(1,? ?)
val? stream = (1? to? 1000000).toStream???? Stream(1, ?)
.head? 第一個值
.tail???? 第一個值后面的所有值
查看全部 -
集合的歸約:
reduceLeft(匿名函數):將集合中的元素,按匿名函數的規則進行處理,處理的結果的類型和集合元素的類型一致
reduceLeft(op:? (T,T)? => T)
foldLeft(初始值)(匿名函數):將集合中的元素與初始值,按匿名函數的規則進行處理,處理的結果類型與初始值類型一致。
foldLeft(z? : U)(op: (U,? T) =>U)
查看全部 -
List高階函數:
map:根據函數規則對List中的每個參數做映射
c.map(x=>x.toUpperCase) 等價于 c.map( _.toUpperCase? )
與filter不同:filter的規則是Boolean類型的
flatMap:將多層的List打平
查看全部 -
List的高階函數:
filter(判斷函數):遍歷集合,保留符合判斷函數的元素
toList:將字符串變成List[Char]集合
takeWhile(判斷函數):遍歷集合,根據判斷函數截取集合元素
查看全部 -
//for for?{ ????x?<-?xs ????y=?x+1 ????if(y>0) }yield?y //if if?(exp)?valA?else?valB
查看全部 -
函數 代碼塊
def?function(?param:?ParamType):?ReturenType={ ????//body }
查看全部 -
三種變量修飾符
val?定義常量,不可修改
var?定義變量
lazy?val?只要第一次使用到時候,才會運算表達式得到值
可以不顯示指定變量的類型,因為Scala會自動進行類型推導Unit類型: 類似Java的Void, 一般作為函數返回值
有Unit一般是副作用,因為函數沒返回值
異常值: ()Nothiong
String
- 構建于Java的String之上
- 新增了字符串插值(interpolation)的特性```scala val?myname?=?"lizhy"?\\?creating?a?String s"My?name?is?${myname}"?\\?String?interpolation ```
在scala語言中,所有的事物都是對象
查看全部 -
在計算機科學領域,函數式編程是一種編程范式,它是一種構建計算機程序結構的方法和風格,它把程序當做數學函數的求值過程并且避免了改變狀態和可變的數據。
二、函數式編程的重要概念:
2.1 純函數(Pure Function),或函數的純粹性(Purity),沒有副作用(Side Effect)。
副作用是狀態的變化(mutation):例子:修改全局變量,拋出異常,IO讀寫,調用有副作用的函數。2.2 引用透明(Referential Transparency):對于相同的輸入,總是得到相同的輸出。
如果f(x)的參數x和函數體都是引用透明的,那么函數f是純函數。2.3 不變性(Immutability)為了獲得引用透明性,任何值都不能變化。
2.4 函數是一等公民(First-class Function):一切都是計算,函數式編程中只有表達式,變量、函數都是表達式。
三、高階函數(Higher order Function)
閉包(Closure)
表達式求值策略:嚴格求值 和 非嚴格求值 ?Call By Value ?vs. ?Call By Name
惰性求值(Lazy Evaluation):定義表達式不會立即求值,用到后才會求值。
遞歸函數,函數式編程沒有循環,循環由遞歸實現。調優遞歸:尾遞歸。查看全部 -
Scalable編程語言。
純正的面向對象語言。
函數式語言。
構建于jvm之上,能互相直接調用,無縫和java互操作。JAVA和SCALA互相直接調用!
查看全部 -
塊
查看全部 -
快排
查看全部 -
快排
查看全部 -
圖
查看全部 -
柯里化
查看全部 -
高階函數
查看全部 -
列子2
返回1
bar(1,loop)? ? 先1進行計算,返回1,方法體沒用到loop 不被調用
bar(loop,1)一直循環? ? ? ? ?先loop進行計算,無法返回
查看全部 -
例子
查看全部 -
求值策略
查看全部 -
match = java 的switch
查看全部
舉報