UGA Boxxx

つぶやきの延長のつもりで、知ったこと思ったこと書いてます

【Vavr】Javaの関数型ライブラリVavrのOption

現在、VavrというJavaの関数型ライブラリを使っているので、このVavrの使い方メモ

今回はOptionだけ

www.vavr.io

io.vavr.control.Option

Optionはオブジェクトの参照がnullかもしれないことを明示的に表せるようにしたクラス

オブジェクトをOptionでラップしておけば、nullチェックが不要になるメリットがある

例えば

@Test
public void 値がnullじゃない場合() {
    String name = "value";
    Option<String> nameOption = Option.of(name);

    assertEquals("value", nameOption.getOrElse("empty"));
}
@Test
public void 値がnullの場合() {
    String name = null;
    Option<String> nameOption = Option.of(name);

    assertEquals("empty", nameOption.getOrElse("empty"));
}

このように変数にnullの場合のデフォルト値を割り当てることができるので、オブジェクトがnullであろうとチェックなしで一行で処理することができる

java標準ライブラリにも類似したAPI(java.util.Optional)があるがそれと異なる点は、 vavrのOptionは「mapの引数の関数がnullを返すときNoneインスタンス(empty)に変換されずSome(null)になる」こと

具体的には以下のような挙動になる

// 1) creates a Some(1)
Option<Integer> intOption = Option.of(1);

// 2) maps 1 to null and creates a Some(null)
Option<String> strOption = intOption.map(i -> null);

// 3) calls null.intern() and throws a NullPointerException
String s = strOption.map(String::intern)
                    .getOrElse("");

これについては以下の記事で語られている

blog.vavr.io