-
集合的歸約:
reduceLeft(匿名函數):將集合中的元素,按匿名函數的規則進行處理,處理的結果的類型和集合元素的類型一致
reduceLeft(op:? (T,T)? => T)
foldLeft(初始值)(匿名函數):將集合中的元素與初始值,按匿名函數的規則進行處理,處理的結果類型與初始值類型一致。
foldLeft(z? : U)(op: (U,? T) =>U)
查看全部 -
list-map高階函數:
map(匿名函數):映射出新的集合
flatMap(匿名函數):將元素為集合的集合,轉換為普通元素的集合
查看全部 -
List的高階函數:
filter(判斷函數):遍歷集合,保留符合判斷函數的元素
toList:將字符串變成List[Char]集合
takeWhile(判斷函數):遍歷集合,根據判斷函數截取集合元素
查看全部 -
scala中數據集合類型:
Set :無序元素
Seq : 有序元素
Map:鍵值對
val? a = List (1,2,3,4,5)
val b = 0 :: a?? ? ?? ::? 元素和集合連接,元素只能在前
結果? val b = List (0,1,2,3,4,5)
::: 集合和集合連接
head?? 取集合的第一個元素
tail????? 生成偽列表(去除第一個元素,輸出含有剩余元素的集合)
isEmpty 判斷集合是否為空(不為空false,為空true)
查看全部 -
def sum(f: Int => Int)(a: Int)(b: Int): Int = {
??? @annotation.tailrec
??? def loop(n: Int, acc: Int): Int = {
????? if (n < a) {
??????? println(s"n=${n},acc=${acc}")
??????? acc
????? } else {
??????? println(s"n=${n},acc=${acc}")
??????? loop(n - 1, acc + f(n))
????? }
??? }
??? loop(b, 0)
? }?????????????????????????????????????????????? //> sum: (f: Int => Int)(a: Int)(b: Int)Int
? sum(x => x)(1)(5)?????????????????????????????? //> n=5,acc=0
????????????????????????????????????????????????? //| n=4,acc=5
????????????????????????????????????????????????? //| n=3,acc=9
????????????????????????????????????????????????? //| n=2,acc=12
????????????????????????????????????????????????? //| n=1,acc=14
????????????????????????????????????????????????? //| n=0,acc=15
????????????????????????????????????????????????? //| res0: Int = 15
? sum(x => x * x)(1)(5)?????????????????????????? //> n=5,acc=0
????????????????????????????????????????????????? //| n=4,acc=25
????????????????????????????????????????????????? //| n=3,acc=41
????????????????????????????????????????????????? //| n=2,acc=50
????????????????????????????????????????????????? //| n=1,acc=54
????????????????????????????????????????????????? //| n=0,acc=55
????????????????????????????????????????????????? //| res1: Int = 55
? def sum2(f: Int => Int)(a: Int)(b: Int): Int = {
??? @annotation.tailrec
??? def loop(n: Int, acc: Int): Int = {
????? if (n > b) {
??????? println(s"n=${n},acc=${acc}")
??????? acc
????? } else {
??????? println(s"n=${n},acc=${acc}")
??????? loop(n + 1, acc + f(n))
????? }
??? }
??? loop(a, 0)
? }?????????????????????????????????????????????? //> sum2: (f: Int => Int)(a: Int)(b: Int)Int
? sum2(x => x)(1)(5)????????????????????????????? //> n=1,acc=0
????????????????????????????????????????????????? //| n=2,acc=1
????????????????????????????????????????????????? //| n=3,acc=3
????????????????????????????????????????????????? //| n=4,acc=6
????????????????????????????????????????????????? //| n=5,acc=10
????????????????????????????????????????????????? //| n=6,acc=15
????????????????????????????????????????????????? //| res2: Int = 15
? sum2(x => x * x)(1)(5)????????????????????????? //> n=1,acc=0
????????????????????????????????????????????????? //| n=2,acc=1
????????????????????????????????????????????????? //| n=3,acc=5
????????????????????????????????????????????????? //| n=4,acc=14
????????????????????????????????????????????????? //| n=5,acc=30
????????????????????????????????????????????????? //| n=6,acc=55
????????????????????????????????????????????????? //| res3: Int = 55查看全部 -
遞歸函數:n!
def factorial(n: Int): Int =
??? if (n <= 0) 1
??? else n * factorial(n - 1)尾遞歸函數:對遞歸函數的優化
? def factorial(n: Int, m: Int): Int =
??? if (n <= 0) m
??? else factorial(n - 1, m * n)????????????????? //> factorial: (n: Int, m: Int)Int
? factorial(5, 1)???????????????????????????????? //> res0: Int = 120? factorial(5,1)的計算邏輯:
? (5,1)=>(5-1,5*1)=>(4-1,5*1*4)=>(3-1,5*1*4*3)=>(2-1,5*1*4*3*2)=>(1-1,5*1*4*3*2*1)=>5*1*4*3*2*1
注:scala中也有while,do ...? while,for循環語法,但其運行邏輯不符合函數式編程思想,所以不建議使用,而建議使用遞歸實現循環
查看全部 -
柯里化語法:把方法的參數列表中的參數,分別取出,單獨放到小括號中。
例如:def? add(x: Int, y: Int) = x + y???? 正常方法定義
????????? def? add(x: Int)(y: Int) = x + y???? 柯里化語法
在開發中可以利用柯里化方法基礎,簡單實現新方法功能,而不需要重新完全定義一個新函數
查看全部 -
def? greeting() =(name : String) => {s"Hello? $name"}
與
def? greeting() =(name : String) => {"Hello"+" "+name}
為相同返回值的函數
查看全部 -
高階函數:
函數作為參數或者返回值的函數
匿名函數:
(形參) => {函數}
查看全部 -
try 表達式: 基本和java中try catch 相似
_ 下劃線代表通配符,也就是代表任何輸出
match 表達式:類似java中的switch
exp? match {
?case p1 => val1
?case p2 => val2
?...
?case _ => valn
}
查看全部 -
for comprehension? 循環
for{
???? x <- xs?? // 遍歷 xs ,每循環一次將xs中的一個值賦給x
???? y = x + 1
???? if (y > 0)
} yield y?
yield 輸出一個List
println 一個一個輸出
查看全部 -
代碼塊Block:{表達式;表達式}
或者
{
表達式
表達式
}
代碼塊也是一個表達式,其最終求得的值是最后一個表達式的值。
scala中函數的定義:
def??? 函數名 (參數:參數類型,參數:參數類型):返回值類型={
函數的表達式
}
查看全部 -
詳細運行過程加深理解查看全部
-
Scala里有2種求值策略:
Call by Value??? 對函數實參求值,且僅求值一次 如: ? def foo(x: Int) = x
Call by Name?? 函數實參每次在函數體內被用到時都會求值? 如:
def foo(x: => Int) = x
恰當的運用這2中求值策略,會提高代碼的運行效率
查看全部 -
柯里化函數:把具有多個參數的函數轉換成一條函數鏈,每個節點上是單一參數
def curriedAdd(a: Int)(b: Int) = a + b
val addOne = curriedAdd(1)_ // 偏應用函數,只有b是靈活可變的。
//1傳給變量a,_為通配符,
addOne(2) //3? ? ?2將傳遞給b
查看全部
舉報