"Two" case3=>"T"/> "Two" case3=>"T">

ホームページ >Java >&#&チュートリアル >Java と Scala での部分関数と部分応用関数の使用方法

Java と Scala での部分関数と部分応用関数の使用方法

王林
王林転載
2023-04-21 16:31:181177ブラウズ

部分関数

部分関数 (部分関数) は数学的な概念であり、「関数」の一種ではなく、関数と並列する概念です。

Scala の Partia 関数は、型が 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() を使用してみます。数字であれば、__=>"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 つのパラメーターを受け取ります。1 つ目は呼び出しパラメーター、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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。