部分應用函式:是指乙個函式有n個引數, 而我們為其提供少於n個引數, 那就得到了乙個部分應用函式.
def sum
(a:int,b:int,c:int)
= a + b + c;
那麼就可以從這個函式衍生出乙個偏函式是這樣的:
def p_sum =
sum(
1, _:int, _:int)
於是就可以這樣呼叫p_sum(2,3), 相當於呼叫sum(1,2,3) 得到的結果是6. 這裡的兩個_分別對應函式sum對應位置的引數. 所以你也可以定義成
def p_sum = sum (_:int,
1, _:int)
偏函式定義:用一對大括號括起來的一系列的 case 語句
偏函式的引出,先看一段需求案例:將 list(1, 2, 3, "abc", false) 的非數字 忽略, 將數字 + 1 並返回
def
main
(args: array[string]
): unit =")
//解決方式二: 模式匹配, 比上面的方法簡單, 但是不夠完美
val list2: list[int]
=list
.filter
(x =
> x.isinstanceof[int]).
map(x =
>})
println(s"模式匹配的方式: $"
)}
執行結果:
filter
+map 的方式:2,
3,4模式匹配的方式:2,
3,4
上面的兩種解決方式比較麻煩,我們使用偏函式解決上述需求:
//
1. 定義乙個偏函式//2
. partialfunction[any, int]
: 表示偏函式接受的引數型別是 any, 返回型別 int//3
. isdefinedat(x: any)//4
.1, 並返回(新的集合)
val partialfun: partialfunction[any, int]
= new partialfunction[any, int]
override def
(v1: any)
: int =
}//使用偏函式
//如果使用偏函式, 則不能使用 map
, 應該使用 collect
val list3: list[int]
=list
.collect(partialfun)
println(s"list3: $"
)
執行結果:
x=1v=
1x=2v=
2x=3v=
3x=abc
x=false
list3:2,
3,4
偏函式的簡寫
def partialfun2: partialfunction[any, int]
=val list4: list[int]
= list.
collect
(partialfun2)
println
(s"list4: $"
)
執行結果:
list4:2,
3,4
偏函式的簡寫再簡寫
//再簡寫
val list5=
list
.collect(
)println(s"list5: $"
)
執行結果:
list5:2,
3,4
下面看兩個偏函式的例項:
偏函式的應用:將 集合中的數字 * 2
//因為 map 只能調整資料型別, 無法改變 集合 的長度, 所以結果會有空值
val list1 =
list(1
,2,4
,"abc"
,false
)val list2: list[anyval]
= list1.
map(
)println
(s"list2: $"
)// list2: 1,4,16,(),()
//collect => filter + map 能做到 過濾 和 map 的組合操作
val list3: list[int]
= list1.
collect()
println
(s"list3: $"
)// list3: 1, 4, 16
偏函式的應用:將 map 的資料重組, 並將新的 map 返回出來
val map: map[int,
(int, int)]=
map(1-
>(2
,20),
10->(20
,30),
20->(30
,40))
val map1 = map.
map(
)println
(s"map1: ($)"
)// map1: (1 -> 20), (10 -> 30), (20 -> 40)
偏函式零碎**:
/
*** 如果你想定義乙個函式, 而讓它只接受和處理其引數定義域範圍內的子集,
* 對於這個引數範圍外的引數則丟擲異常, 這樣的函式就是偏函式(這個函式只處理傳入來的部分引數)*/
defmain
(args: array[string]
): unit =
//上面的偏函式定義麻煩, 偏函式與 scala 語句結合起來能使**更簡潔, 如下
val divide2: partialfunction[int, int]
=//println(
"沒有用偏函式的部分應用函式: "
+divide1(10)
)//println(
"用了偏函式的部分應用函式: "
+divide2(10)
) val rs: partialfunction[int, string]
=//println(rs(1)
)//orelse: 將多個偏函式組合起來使用, 結合起來的效果類似 case 語句
// 但是每個偏函式裡又可以再使用case
val or1 : partialfunction[int, string]
= val or2 : partialfunction[int, string]
= val or_ : partialfunction[int, string]
= val or
= or1 orelse or2 orelse or_
println(or(
2))}
Scala部分函式 偏函式
例如 def sum x int,y int,z int x y z,當呼叫sum的時候,如果不提供所有的引數,或者只提供某些引數時,比如sum sum 3,int,int sum int,3,4 這樣就生成了所謂的部分應用函式。案例 def showmsg title string content...
偏函式與部分應用函式
首先偏函式是個數學概念,偏函式不是 函式 的一種,而是乙個跟函式平行的概念.定義可參考wiki 它是指定義域x中可能存在某些值在值域y中沒有對應的值.scala可以通過模式匹配來定義偏函式,下面這兩種方式定義的函式,都可以認為是偏函式,因為他們都只對其定義域int的部分值做了處理.那麼像p1哪有定義...
scala中的部分應用函式和偏函式的區別
本人總結如下 偏函式是只對函式定義域的乙個子集進行定義的函式。scala中用scala.partialfunction t,s 類來表示 比如定義了乙個函式 def sum x int y int x y,當呼叫sum的時候,如果不提供所有的引數或某些引數還未知時,比如sum sum 3 int s...