[Scala]PartialFunction 部分関数?

2011年12月15日

とりえあず、以下のようなコードを書きます。

[scala]val pf:PartialFunction[String,Option[String]] = {
case null => None
case "" => None
case s => Some(s)
}[/scala]

これで、nullはNone、""もNone、普通の文字列はOptionに変換という処理をしてくれます。

関数の使い方は

[scala]val list = List("test1", null, "test2", "", "test3", "staging1")
list collect pf[/scala]

とすると、

[scala]List(Some(test1), None, Some(test2), None, Some(test3), Some(staging1))[/scala]

が返ってきます。

また、リストから一部の項目をフィルタリングしたりする場合にも使えます。

[scala]val regStaging = """staging.+""".r
// この処理は、staging.+にマッチする文字のみを返す
// 正規表現マッチの場合はあらかじめ正規表現オブジェクトを作っておく必要がある
val staging: PartialFunction[String, String] = { case t @ regStaging() => t }[/scala]

こんな感じにした場合に

[scala]list.collect(staging)[/scala]

を実行すると、

[scala]List(staging1)[/scala]

が返ってきます。

このPartialFunctionが便利なところが、orElseでPartialFunction同士を結合することが出来ることです。

以下のようにtestAndStagingを作成します。

[scala]val regStaging2 = """(staging)(.+)""".r
val staging2: PartialFunction[String, String] = { case t @ regStaging2(a, b) => a + "の" + b }
list.collect(staging2) // => List(stagingの1)を返す

val regTest = """test.+""".r
// この処理はtest.+にマッチする文字のみ返す
// 正規表現マッチの場合はあらかじめ正規表現オブジェクトを作っておく必要がある
val test: PartialFunction[String, String] = { case t @ regTest() => t }
list.collect(test) // => List(test1, test2, test3)を返す

//test.+とstaging.+の両方にマッチする条件を構築
val testAndStaging = test.orElse(staging)
list.collect(testAndStaging)[/scala]

すると、

[scala]List(test1, test2, test3, staging1)を返す[/scala]

が返ってきます。

Scala

Posted by GENDOSU