首頁 > Java > java教程 > 主體

Java與Scala中的偏函數與偏程式應用函數的使用方法

王林
發布: 2023-04-21 16:31:18
轉載
1172 人瀏覽過

偏函數

偏函數(Partial Function),是一個數學概念它不是"函數"的一種, 它跟函數是平行的概念。

Scala中的Partia Function是一個Trait,其的型別為PartialFunction[A,B],其中接收一個型別為A的參數,傳回一個型別為B的結果。

例如:

    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
登入後複製

偏函數內部有一些方法,像是isDefinedAt、OrElse、 andThen、applyOrElse等等。

isDefinedAt

isDefinedAt : 這個函數的作用是判斷傳入來的參數是否在這個偏函數所處理的範圍內。

剛才定義的pf來嘗試使用isDefinedAt(),只要是數字都是正確的,因為有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 : 將多個偏函數組合起來使用,效果類似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: 相當於方法的連續調用,例如g(f(x))。

pf1的結果回傳型別必須和pf2的參數傳入型別必須一致,否則會報錯。

   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個參數,第一個是呼叫的參數,第二個是個回呼函數。如果第一個呼叫的參數匹配,則傳回匹配的值,否則呼叫回調函數。

  val pf: PartialFunction[Int, String] = {
      case 1 => "One"
    }
    println(pf.applyOrElse(1, { num: Int => "two" }))  //One
    println(pf.applyOrElse(2, { num: Int => "two" }))  //two
登入後複製

偏應用函數

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

部分應用函數, 是指一個函數有n個參數, 而我們為其提供少於n個參數, 那就得到了一個部分應用函數。

舉個例子,定義好一個函數有3個參數,再提供幾個有1-2個已知參數的偏應用函數

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
登入後複製

以上是Java與Scala中的偏函數與偏程式應用函數的使用方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:yisu.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板