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