【Scala】Scala ~ 部分関数 / PartialFunction ~

■ はじめに

Scala の 部分関数 (PartialFunction) について、学んでいく

目次

【1】部分関数 / PartialFunction
 1)サンプル
【2】部分関数の合体 - orElseメソッド
 1)サンプル
 2)使用上の注意

【1】部分関数 / PartialFunction

* 特定の引数のみ処理する関数
* PartialFunction 自体は、トレイル

1)サンプル

例1

object  Hello {
  private val demoPartialFunction: PartialFunction[String, String] = {
    case "red" => "AKA"
    case "blue" => "AO"
    case _ => "Other"
  }

  def main(args: Array[String]): Unit = {
    println(demoPartialFunction("red"))
    println(demoPartialFunction("blue"))
    println(demoPartialFunction("yellow"))
  }
}

例2

object  Hello {
  def main(args: Array[String]): Unit = {
    val samples = 1 to 10
    val isEven: PartialFunction[Int, String] = {
      case x if x % 2 == 0 => s"${x} is even"
    }
    val evenNumbers = samples collect isEven
    evenNumbers.foreach(println)
  }
}

/**
2 is even
4 is even
6 is even
8 is even
10 is even
*/

【2】部分関数の合体 - orElseメソッド

* orElse メソッドを使って、部分関数の合体することができる

1)サンプル

object  Hello {
  private val demoPartialFunction: PartialFunction[String, String] = {
    case "red" => "AKA"
    case "blue" => "AO"
  }
  private val demo2PartialFunction: PartialFunction[String, String] = {
    case "yellow" => "KIRO"
    case "green" => "MIDORI"
    case _ => "Other"
  }
  def main(args: Array[String]): Unit = {
    val newDemoPartialFunction = demoPartialFunction orElse demo2PartialFunction
    
    println(newDemoPartialFunction("red"))
    println(newDemoPartialFunction("blue"))
    println(newDemoPartialFunction("yellow"))
    println(newDemoPartialFunction("green"))
    println(newDemoPartialFunction("black"))
  }
}

出力結果

AKA
AO
KIRO
MIDORI
Other

2)使用上の注意

* 順番や 「case _」に気を付けて合成しないと
 意図しない動きになる可能性がある

ダメな例

  def main(args: Array[String]): Unit = {
    //val newDemoPartialFunction = demoPartialFunction orElse demo2PartialFunction
    val newDemoPartialFunction = demo2PartialFunction orElse demoPartialFunction

/**
Other
Other
KIRO
MIDORI
Other
*/

参考文献

https://yuroyoro.hatenablog.com/entry/20100705/1278328898
https://www.membersedge.co.jp/blog/partialfunction_scala/
https://gist.github.com/takezoe/29ebbd5575b6fcdded3b

関連記事

Scala ~ 環境構築編 ~
https://dk521123.hatenablog.com/entry/2023/03/10/193805
Scala ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2023/03/12/184331
Scala ~ 基本編 / コレクション ~
https://dk521123.hatenablog.com/entry/2023/03/13/000345
Scala ~ コレクションで使えるメソッド ~
https://dk521123.hatenablog.com/entry/2023/09/07/223422