Optionalを使ってnull判定のif分岐を極力減らす

こんばんは。

エキサイト株式会社の中尾です。

JavaのOptionalを使ってnull判定のif分岐を極力減らす方法をご紹介します。

if分岐を減らす一つの方法として、

  1. mapを使う (戻り値有り)
  2. ifPresentOrElseを使う (戻り値なし)

の2種類があります。

以下、コード例です。

package main.java.poc;

import java.util.Optional;

public class OptionalPoc {
    public static void main(String[] args) {
        Optional<String> hello = Optional.of("HELLO");
        Optional<String> world = Optional.empty();

        System.out.println("*** ifを使った書き方 ***");
        if (hello.isEmpty()) {
            System.out.println("hello は nullだよ");
        } else {
            System.out.println("hello は " + hello.get() + "あるよ");
        }

        if (world.isEmpty()) {
            System.out.println("world は nullだよ");
        } else {
            System.out.println("world は " + world.get() + "あるよ");
        }

        System.out.println("");
        System.out.println("*** mapを使った書き方 mapは戻り値を持つ ***");
        final String s = hello
                .map(e -> {
                    final String e1 = e;
                    return "hello は " + e1 + "だよ";
                })
                .orElse("hello は nullだよ");
        System.out.println(s);

        final String s1 = world
                .map(e -> {
                    final String e1 = e;
                    return "world は " + e1 + "だよ";
                })
                .orElse("world は nullだよ");
        System.out.println(s1);

        System.out.println("");
        System.out.println("*** ifPresentOrElseを使った書き方 ifPresentOrElseは戻り値なし ***");
        hello.ifPresentOrElse(
                e -> {
                    System.out.println("hello は " + e + "あるよ");
                },
                () -> {
                    System.out.println("hello は nullだよ");
                }
        );

        world.ifPresentOrElse(
                e -> {
                    System.out.println("world は " + e + "あるよ");
                },
                () -> {
                    System.out.println("world は nullだよ");
                }
        );
    }
}

実行結果

*** ifを使った書き方 ***
hello は HELLOあるよ
world は nullだよ

*** mapを使った書き方 mapは戻り値を持つ ***
hello は HELLOだよ
world は nullだよ

*** ifPresentOrElseを使った書き方 ifPresentOrElseは戻り値 void ***
hello は HELLOあるよ
world は nullだよ

注意点として、ifPresentOrElseは戻り値がありません。 もちろんこれだけではありませんし、コードの可読性が100%上がるわけではないのでケースバイケースで使ってください。

なにかの参考になれば幸いです。