溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Java?Scala偏函數(shù)與偏應(yīng)用函數(shù)怎么使用

發(fā)布時間:2023-04-08 10:35:23 來源:億速云 閱讀:92 作者:iii 欄目:開發(fā)技術(shù)

這篇文章主要介紹“Java Scala偏函數(shù)與偏應(yīng)用函數(shù)怎么使用”的相關(guān)知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“Java Scala偏函數(shù)與偏應(yīng)用函數(shù)怎么使用”文章能幫助大家解決問題。

偏函數(shù)

偏函數(shù)(Partial Function),是一個數(shù)學(xué)概念它不是"函數(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: 相當(dāng)于方法的連續(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 1

applyOrElse

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

偏應(yīng)用函數(shù)

偏應(yīng)用函數(shù)(Partial Applied Function)也叫部分應(yīng)用函數(shù),跟偏函數(shù)(Partial Function)從英文名來看只有一字之差,但他們二者之間卻有天壤之別。

部分應(yīng)用函數(shù), 是指一個函數(shù)有n個參數(shù), 而我們?yōu)槠涮峁┥儆趎個參數(shù), 那就得到了一個部分應(yīng)用函數(shù)。

舉個例子,定義好一個函數(shù)有3個參數(shù),再提供幾個有1-2個已知參數(shù)的偏應(yīng)用函數(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ù)與偏應(yīng)用函數(shù)怎么使用”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識,可以關(guān)注億速云行業(yè)資訊頻道,小編每天都會為大家更新不同的知識點。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI