LoginSignup
30
18

More than 1 year has passed since last update.

OptionalのorElse()とorElseGet()の使い分けが気になったので

Last updated at Posted at 2018-10-10

Optional is 何

Java8で追加されたクラス - java.util.Optional

null以外の値が含まれている場合も含まれていない場合もあるコンテナ・オブジェクトです。
by https://docs.oracle.com/javase/jp/8/docs/api/java/util/Optional.html

なるほど、わからん。

似てる

  • orElse(T other)
    存在する場合は値を返し、それ以外の場合はotherを返します。

  • orElseGet(Supplier<? extends T> other)
    値が存在する場合はその値を返し、そうでない場合はotherを呼び出し、その呼び出しの結果を返します。

とりあえずお試しコード

Main.java
import java.util.*;

public class Main {
    public static void main(String[] args) throws Exception {

        // 1.
        Optional.of("hoge").orElseGet(() -> {
            System.out.println("実行されないorElseGetだよ");
            return "";
        });

        // 2.
        Optional.empty().orElseGet(() -> {
            System.out.println("実行されるorElseGetだよ");
            return "";
        });

        // 3.
        String piyo = (String)Optional.of("hoge").orElse("返却されないorElseだよ");
        System.out.println("piyo: " + piyo);

        // 4.
        String piyo2 = (String)Optional.empty().orElse("返却されるorElseだよ");
        System.out.println("piyo2: " + piyo2);

    }
}

結果

                              // 1.
実行されるorElseGetだよ         // 2.
piyo: hoge                     // 3.
piyo2: 返却されるorElseだよ     // 4.

つまり・・・?

 orElse()はOptionalの中身がnullであるかにかかわらず実行されて、oeElseGet()はnullの場合だけ実行される。

結論

  • 「nullの場合は空文字やゼロを返す」のように定数を返すだけのためにラムダ式を書くのは無駄なのでorElse()が良い
  • 「nullの場合は何かしらの処理を行い、その結果を返却する」の場合はorElseGet()
30
18
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
30
18