無名関数+パターンマッチの略記法

この略記法は、普通に使われているのに、意外と知らない人が多い略記法ということで紹介してみます。

まず、タプルのListに対してmapメソッドを呼び出すことを考えて見ます。略記法を使わずに普通に書くと以下のようになるでしょう。

List("A" -> 1, "B" -> 2, "C" -> 3).map{t => t match { case (k, v) => k + v } }

しかし、この書き方は冗長ですね。もうちょっとマシな書き方は無いものでしょうか。そのようなときのために、便利な略記法が用意されています。上記のコードは、ほとんどの場合、次のように書き換えることができます。

List("A" -> 1, "B" -> 2, "C" -> 3).map{ case (k, v) => k + v}

このパターンでは、case節が一つしか出現していませんが、実際にはいくつもcase節を並べて書くことができます。

なお、この略記法について、scala.PartialFunction型のオブジェクトを生成するためのものだという解説がしばしば見られるのですが、厳密には正しくありません。

実際には、scala.PartialFunction型が期待されている箇所に、{ case pat => ... }が現れた場合にのみ、scala.PartialFunction型のオブジェクトに変換され、それ以外は普通の無名関数+パターンマッチングの略記法として扱われます。