Java8のOptionalがモナドになったよ!

Java8にはOptionalクラスが導入されたのですが、5月にエントリを書いた時点ではモナドではありませんでした。
Java8でのプログラムの構造を変えるOptional、ただしモナドではない


それが、5月末にどうもソースにモナドに必要なメソッドが追加されたらしいということになって、いつ使えるようになるか待っていたら、いつの間にか使えるようになっていました。
Optional (Java Platform SE 8 b101)


こちらからダウンロードできます。
JDK8 Early Access Releases ― Project Kenai


他にもいくつか便利メソッドが追加されたおかげで、このようなコードが書けるようになりました。

String str = "abcd";
Optional.ofNullable(str)
    .map(st -> st.toUpperCase())
    .filter(st -> st.length() > 3)
    .ifPresent(st -> System.out.println("s:" + st));


mapメソッドやfilterメソッドが用意されています。mapメソッドでは、関数がnullを返すとemptyなOptionalが返ります。
あと、null以外のときOptionalを返して、nullのときemptyなOptionalを返す、ofNullableメソッドも用意されています。


これ、たとえばstrがnullになる可能性があるとして、さらにtoUpperCaseもnullを返す可能性があるとすると、次のようなコードが必要になっていました。

String str = "nullかも";
if(str != null){
  String s = str.toUpperCase();//ここでもnullになる可能性があるとする
  if(s != null && s.length() > 3){
    System.out.println("s:" + s);
  }
}


5月時点のOptionalを使っても、一旦Optionalから値を取り出して処理するか、isPresentを入れ子にして、その中であらためてOptionalを使うようなコードが必要になっていました。
でも、mapメソッドやfilterメソッドが導入されたおかげで、Optionalから値を出さずに、値がnullかどうかを気にせずに処理を書くことができるようになりました。

やったね!