2012年1月25日水曜日

Scala Tips / null

null値の可能性がある値をnull値ではない普通の値に持ち上げるイディオムです。

(分類の基準)

Java風

if式で変数がnullかどうかを判定します。

def f(a: String, b: String): String = {
  if (a == null) b
  else a
}

実際に使う時は以下のような感じになります。

val c = if (a == null) b else a

Scala風

match式を使う時は以下のようになります。この場合は、Java風の方が簡潔ですね。

def f(a: String, b: String): String = {
  a match {
    case null => b
    case _ => a
  }
}

Scala

OptionとOption#getOrElseを使うと簡潔に記述できます。

def f(a: String, b: String): String = {
  Option(a) getOrElse b
}

Scalaz

Scalazを使うと、さらに簡潔に記述することができます。

def f(a: String, b: String): String = {
  a ?? b
}

以下のような形でメソッドの引数に書きたい場合は、"??"を使った簡潔な記述方法は重宝します。

val a = SomeJavaObject.getStringValue()
println("Value is " + a ?? "unknown")

ノート

プログラムの実行速度という観点では、「Java風」が一番速く、「Scala」はオブジェクト生成とメソッド呼出しが余分に発生するためかなり遅くなります。「Scalaz」は、さらに一段余分にオブジェクト生成とメソッド呼出しが発生するため、さらに低速です。

つまり、Javaの実行速度とScalaの記述力のトレードオフが発生するわけです。実行速度を採るのであればJavaで書けばよいので、Scalaで書く以上、簡潔に記述できることを重視するのがよいでしょう。

まずScalaで書いてみて、プロファイルでホットスポットと判明した処理については、Java風に書き直したり、Java(場合によってはC++)で書いて呼び出すというアプローチになります。

0 件のコメント:

コメントを投稿