scala 06Map Tuple Zip實戰解析

2021-07-04 13:41:40 字數 4292 閱讀 3878

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...