Optionがモナドだったなんて・・・orz
いやね、Scalaの話なんですけどね、何の話かってね、Option型がOption("a")
とかってやって生成できるの。。。
> val a = "abc" a: String = abc > val o = Option(a) o: Option[String] = Some(abc)
今までずっとSome(a)
かNone
でしかOption生成できないと思っていた自分が恥ずかしくて(><;;
いや、ね、Monadには単位元というかreturn
?pure
?point
?
とにかくscalaのapply
に当たる何かがあることが定義上必要なんですよ。
つまり絶対Option(???)
で何か生成できるはずなのに、なぜか出来ないって思いこんで居たっていう。。。
で、なんでこんな話をしているかというと、Javaのライブラリを使う時のnull
対策。
> val a: String = null a: String = null > val o = Option(a) o: Option[String] = None
この通り、null
の値の変数をOptionにapplyするとちゃんとNone
を返してくれる!!!
つい先日apache poiのためのscalaを(spoiwoは微妙に古いので)自作していたんだけど、
これが結構null
が返ってくる。
その時書いてたコードがこちら
def getRow(idx: Int)(sh: Sheet): Option[Row] = { val r = sh.getRow(idx) if (r == null) None else Some(r) }
これ、全部Optionのapllyでいいじゃんっていう・・・
是非これからやる人は読みやすい方を使ってください。。。