Play Framework 2.0 ビューで西暦を和暦に変換する

Java で Play Framework 2.0 に取っ組んでるわけですけど、
ビューの上であれこれ処理をしなきゃいけなくなると、どうしても Scala からは逃れられなくなっちゃいます。

たとえば、同じ画面の上で西暦も和暦も表示したいぞ!なんてとき。
あらかじめコントローラーで両方を計算しておいて、ビューの引数を増やせば済むよね!
という力技ももちろんあるにはあるけれど、せっかくの Play! 2.0 なんだから Scala 使わなきゃ。

ということで、ビューの上で Scala で処理しちゃいましょう、というのが今回のお話です。
Scala 初心者なので、スマートさにはずいぶん欠けるかもしれません。
でも、Scala をかじるきっかけにはなるでしょうし、
「あ、こんな感じね」というヒントにはなるかなーと考えてます。
そのうち、もうちょっとブラッシュアップできてくといいかなー。

ひとまずソースです。

ビューの一番アタマの部分です。
ページの引数として、pages.TestPageData クラスのオブジェクトを受け取ってます。
デフォルトでは pages なんていうパッケージはありませんが、
ページで扱うデータは pages パッケージのクラスに、フォームで扱うデータは forms パッケージのクラスに
それぞれ格納するのがうちの癖です。
やっぱり直観的にわかるのが一番いいですしね。

次がビューでの Scala のメソッドの宣言方法です。

こんな風に書きます。
@getWareki がメソッド、(in: String) で String 引数型の引数を in という変数名で扱います。
ちなみに、一般的な Scala プログラムで同じ内容を記述すると

となります。

Scala は Java ベースの言語で、Java のライブラリをそのまま扱えるという特性を持っています。
ここでも java.util.Date をそのまま使ってしまいます。
また、文末に「 ; 」セミコロンがありませんけれど、誤植じゃありません。
Scala は明示的にセミコロンを書かなくても、適切に処理してくれます。

変数の定義をします。定義の方法には val と var の2種類があります。
val は定義すると値を変更することはできません。Java の static のように使うことができます。
var は一般的な変数です。
型の宣言がありませんが、Scala ではこれは普通のことです。
Scala のコンパイラには強力な型推測機能があります。
明示的に型が推論できる場合には省略してしまうことができます。

入力値を trim して、Integer で受け取っているだけの処理です。
try ~ catch 文は Java でも見なれたものです。
ただし、Exception を case 文で受け取るところが違います。
もう一つ見なれない => はパターンマッチした時を示します。
まさに矢印そのものと捉えていいと思います。

では、Scala の StringLike.format メソッドを使って、現在日付から、年の部分のみを抽出しています。
StringLike.format については、ここらへんを参考にするとよいかもです。

西暦を和暦(平成)に変換するために1988を引いています。
年号が変わったら‥‥その時はその時で!
Some(…) は、Scala の Option というラップクラスの子クラスです。
Option クラスは、値が Null のときでも NullPointerException を返さないという特徴があります。
値があるときは、Some(…) の中身を、処理に失敗した時は None オブジェクトを返してくれます。

戻り値を明示していませんが、これも Scala の特徴です。
最後の行で処理した結果を、自動的に戻り値として返してくれます。
今回の場合は Some(wareki.toString()) の結果を返します。

もし、結果がマイナスになっちゃった!という人は、入力値を疑ってくださいね。
もともとの年度が Javascript で生成したものであるなら、
ブラウザによっては 1900 年からの差分を返す場合があります。
javascript 側でこんな風に記述しておくとよいかもです。

実際の表示部分ではこんな風に使います。

というわけで、今回は Scala を少しかじってみました。
コントローラーで処理するか、ビューで処理するかは好みの分かれるところだと思いますが、
ビューで処理する方法も覚えておくと、柔軟に対応できていいんじゃないかなーと思ってます。

Scala について、もう少し深く触れておきたいなー、という場合は、
この2冊がおすすめです。

「Scala プログラミング入門」は、これまで Java で書いてきたけど、
Scala もかじってみたいという人に最適。
「Scala スケーラブルプログラミング」は通称「コップ本」と呼ばれているバイブル的な存在です。
2冊まとめてもとめておくと、今後も活用できるはずです。