Java Scala偏函數(shù)與偏應用函數(shù)超詳細講解
偏函數(shù)
偏函數(shù)(Partial Function),是一個數(shù)學概念它不是"函數(shù)"的一種, 它跟函數(shù)是平行的概念。
Scala中的Partia Function是一個Trait,其的類型為PartialFunction[A,B],其中接收一個類型為A的參數(shù),返回一個類型為B的結(jié)果。
例如:
val pf: PartialFunction[Int, String] = {
case 1 => "One"
case 2 => "Two"
case 3 => "Three"
case _ => "Other"
}
println(pf(1)) //One
println(pf(2)) //Two
println(pf(3)) //Three
println(pf(4)) //Other偏函數(shù)內(nèi)部有一些方法,比如isDefinedAt、OrElse、 andThen、applyOrElse等等。
isDefinedAt
isDefinedAt : 這個函數(shù)的作用是判斷傳入來的參數(shù)是否在這個偏函數(shù)所處理的范圍內(nèi)。
剛才定義的pf來嘗試使用isDefinedAt(),只要是數(shù)字都是正確的,因為有case _=>"Other"這一句。如果換成其他類型就會報錯。
val pf: PartialFunction[Int, String] = {
case 1 => "One"
case 2 => "Two"
case 3 => "Three"
case _ => "Other"
}
println(pf.isDefinedAt(1)) //true
println(pf.isDefinedAt(2)) //true
println(pf.isDefinedAt(3)) //true
println(pf.isDefinedAt(4)) //true
println(pf.isDefinedAt("1"))
/**
* 類型不匹配
* type mismatch;
* found : String("1")
* required: Int
* println(pf.isDefinedAt("1")) */orElse
orElse : 將多個偏函數(shù)組合起來使用,效果類似case語句。
val onePF: PartialFunction[Int, String] = {
case 1 => "One"
}
val twoPF: PartialFunction[Int, String] = {
case 2 => "Two"
}
val threePF: PartialFunction[Int, String] = {
case 3 => "Three"
}
val otherPF: PartialFunction[Int, String] = {
case _ => "Other"
}
val newPF = onePF orElse twoPF orElse threePF orElse otherPF
println(newPF(1)) //One
println(newPF(2)) //Two
println(newPF(3)) //Three
println(newPF(4)) //Other這樣,newPF跟原先的pf效果是一樣的。
andThen
andThen: 相當于方法的連續(xù)調(diào)用,比如g(f(x))。
pf1的結(jié)果返回類型必須和pf2的參數(shù)傳入類型必須一致,否則會報錯。
val pf1: PartialFunction[Int, String] = {
case i if i == 1 => "One"
}
val pf2: PartialFunction[String, String] = {
case str if str eq "One" => "The num is 1"
}
val num = pf1 andThen pf2
println(num(1)) //The num is 1applyOrElse
applyOrElse:它接收2個參數(shù),第一個是調(diào)用的參數(shù),第二個是個回調(diào)函數(shù)。如果第一個調(diào)用的參數(shù)匹配,返回匹配的值,否則調(diào)用回調(diào)函數(shù)。
val pf: PartialFunction[Int, String] = {
case 1 => "One"
}
println(pf.applyOrElse(1, { num: Int => "two" })) //One
println(pf.applyOrElse(2, { num: Int => "two" })) //two偏應用函數(shù)
偏應用函數(shù)(Partial Applied Function)也叫部分應用函數(shù),跟偏函數(shù)(Partial Function)從英文名來看只有一字之差,但他們二者之間卻有天壤之別。
部分應用函數(shù), 是指一個函數(shù)有n個參數(shù), 而我們?yōu)槠涮峁┥儆趎個參數(shù), 那就得到了一個部分應用函數(shù)。
舉個例子,定義好一個函數(shù)有3個參數(shù),再提供幾個有1-2個已知參數(shù)的偏應用函數(shù)
def add(x: Int, y: Int, z: Int) = x + y + z
// x 已知
def addX = add(1, _: Int, _: Int)
println(addX(2, 3)) //6
println(addX(3, 4)) //8
// x 和 y 已知
def addXAndY = add(10, 100, _: Int)
println(addXAndY(1)) //111
// z 已知
def addZ = add(_: Int, _: Int, 10)
println(addZ(1, 2)) //13到此這篇關(guān)于Java Scala偏函數(shù)與偏應用函數(shù)超詳細講解的文章就介紹到這了,更多相關(guān)Java Scala偏函數(shù)與偏應用函數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
spring中使用@Autowired注解無法注入的情況及解決
這篇文章主要介紹了spring中使用@Autowired注解無法注入的情況及解決,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-09-09
Java實現(xiàn)讀取項目中文件(.json或.properties)的方法詳解
這篇文章主要為大家詳細介紹了Java實現(xiàn)讀取項目中文件的方法,例如.json或.properties,文中的示例代碼講解詳細,感興趣的小伙伴可以了解一下2023-04-04
Java項目Guava包?HashMultimap使用及注意事項
guava基本上可以說是java開發(fā)項目中,大概率會引入的包,今天介紹的主角是一個特殊的容器HashMultmap,可以簡單的將它的數(shù)據(jù)結(jié)構(gòu)理解為Map<K,?Set<V>>,今天主要介紹下基礎(chǔ)的知識點?HashMultmap級使用,感興趣的朋友一起看看吧2022-05-05
java 出現(xiàn)問題javax.servlet.http.HttpServlet was not found解決方法
這篇文章主要介紹了java 出現(xiàn)問題javax.servlet.http.HttpServlet was not found解決方法的相關(guān)資料,需要的朋友可以參考下2016-11-11

