map、
tuple
、zip
實戰解析1 2
scala> val numbers = list(1, 2, 3, 4)
numbers: list[int] = list(1, 2, 3, 4)
集合中沒有重複元素1 2
scala> set(1, 1, 2)
res0: scala.collection.immutable.set[int] = set(1, 2)
option是乙個包含或者不包含某些事物的容器。
option的基本介面類似於:1 2
3 4 5
trait option[t] else
參考 《effective scala》中關於 options
的內容。
list(1,2,3) map squared會在列表的每個元素上分別應用squared函式,並且返回乙個新的列表,可能是list(1,4,9)。我們把類似於map這樣的操作稱為組合器。(如果你需要乙個更好的定義,你或許會喜歡stackoverflow上的關於組合器的解釋
。在列表中的每個元素上計算乙個函式,並且返回乙個包含相同數目元素的列表。1 2
scala> numbers.map((i: int) => i * 2)
res0: list[int] = list(2, 4, 6, 8)
或者傳入乙個部分計算的函式1 2
3 4 5
scala> def timestwo(i: int): int = i * 2
timestwo: (i: int)int
scala> numbers.map(timestwo _)
res0: list[int] = list(2, 4, 6, 8)
foreach和map相似,只不過它沒有返回值,foreach只要是為了對引數進行作用。1
scala> numbers.foreach((i: int) => i * 2)
沒有返回值。
你可以嘗試把返回值放在乙個變數裡,不過它的型別應該是unit(或者是void)1 2
scala> val doubled = numbers.foreach((i: int) => i * 2)
doubled: unit = ()
移除任何使得傳入的函式返回false的元素。返回boolean型別的函式一般都稱為斷言函式。1 2
scala> numbers.filter((i: int) => i % 2 == 0)
res0: list[int] = list(2, 4)1 2
3 4 5
scala> def iseven(i: int): boolean = i % 2 == 0
iseven: (i: int)boolean
scala> numbers.filter(iseven _)
res2: list[int] = list(2, 4)
zip把兩個列表的元素合成乙個由元素對組成的列表裡。1 2
scala> list(1, 2, 3).zip(list("a", "b", "c"))
res0: list[(int, string)] = list((1,a), (2,b), (3,c))
partition根據斷言函式的返回值對列表進行拆分。1 2
3 scala> val numbers = list(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
scala> numbers.partition(_ %2 == 0)
res0: (list[int], list[int]) = (list(2, 4, 6, 8, 10),list(1, 3, 5, 7, 9))
find返回集合裡第乙個匹配斷言函式的元素1 2
scala> numbers.find((i: int) => i > 5)
res0: option[int] = some(6)
drop丟棄前i個元素1 2
scala> numbers.drop(5)
res0: list[int] = list(6, 7, 8, 9, 10)
dropwhile移除前幾個匹配斷言函式的元素。例如,如果我們從numbers列表裡dropwhile奇數的話,1會被移除(3則不會,因為它被2所「保護」)。1 2
scala> numbers.dropwhile(_ % 2 != 0)
res0: list[int] = list(2, 3, 4, 5, 6, 7, 8, 9, 10)1 2
scala> numbers.foldleft(0)((m: int, n: int) => m + n)
res0: int = 55
0是起始值(注意numbers是乙個list[int]),m是累加值。
更加直觀的來看:1 2
3 45 6
7 89 10
11 12
scala> numbers.foldleft(0)
m: 0 n: 1
m: 1 n: 2
m: 3 n: 3
m: 6 n: 4
m: 10 n: 5
m: 15 n: 6
m: 21 n: 7
m: 28 n: 8
m: 36 n: 9
m: 45 n: 10
res0: int = 55
這個和foldleft相似,只不過是方向相反。1 2
3 45 6
7 89 10
11 12
scala> numbers.foldright(0)
m: 10 n: 0
m: 9 n: 10
m: 8 n: 19
m: 7 n: 27
m: 6 n: 34
m: 5 n: 40
m: 4 n: 45
m: 3 n: 49
m: 2 n: 52
m: 1 n: 54
res0: int = 55
flatten可以把巢狀的結構展開。1 2
scala> list(list(1, 2), list(3, 4)).flatten
res0: list[int] = list(1, 2, 3, 4)
flatmap是乙個常用的combinator,它結合了map和flatten的功能。flatmap接收乙個可以處理巢狀列表的函式,然後把返回結果連線起來。1 2
3 4 5
scala> val nestednumbers = list(list(1, 2), list(3, 4))
nestednumbers: list[list[int]] = list(list(1, 2), list(3, 4))
scala> nestednumbers.flatmap(x => x.map(_ * 2))
res0: list[int] = list(2, 4, 6, 8)
可以把它當作map和flatten兩者的縮寫:1 2
scala> nestednumbers.map((x: list[int]) => x.map(_ * 2)).flatten
res1: list[int] = list(2, 4, 6, 8)
這個呼叫map和flatten的示例是這些函式的類「組合器」特點的展示。
see also effective scala has opinions about flatmap
.flatmap是乙個常用的combinator,它結合了map和flatten的功能。flatmap接收乙個可以處理巢狀列表的函式,然後把返回結果連線起來。1 2
3 4 5
scala> val nestednumbers = list(list(1, 2), list(3, 4))
nestednumbers: list[list[int]] = list(list(1, 2), list(3, 4))
scala> nestednumbers.flatmap(x => x.map(_ * 2))
res0: list[int] = list(2, 4, 6, 8)
可以把它當作map和flatten兩者的縮寫:1 2
scala> nestednumbers.map((x: list[int]) => x.map(_ * 2)).flatten
res1: list[int] = list(2, 4, 6, 8)
這個呼叫map和flatten的示例是這些函式的類「組合器」特點的展示。
see also effective scala has opinions about flatmap
.
Scala12 Scala高階函式
scala混合了物件導向和函式式的特性,我們通常將可以作為引數傳遞到方法中的表示式叫做函式。在函式式程式語言中,函式是 頭等公民 高階函式包含 作為值的函式 匿名函式 閉包 柯里化等等。可以像任何其他資料型別一樣被傳遞和操作的函式。定義函式時格式 val 變數名 輸入引數型別和個數 函式實現和返回值...
Scala七 Scala核心一 函式
1.如果函式體只有一行 則可以不用寫 比如 def print x int println x 一行上的多條語句用分號隔開,則只有第一句屬於方法體,例如 def printwithvalue x int string println x abc 上面的 報錯,因為,printwithvalue的方法...
scala練習題 Scala基礎
1 在scala repl中,計算3的平方根,然後再對該值求平方。現在,這個結果與3相差多少?scala scala.math.sqrt 3 warning there were 1 deprecation warnings re run with deprecation for details r...