Java8のOptionalクラスの使い方

Java8のOptionalクラスの使い方

Java8からjava.util.Optionalクラスが追加されました。

nullチェックをしてくれるクラスです。

Optional.ofNullable

以下のように値をOptional.ofNullableメソッドでラップします。get()で値を取得します。

import java.util.Optional;
public class Sample {
  public static void main(String[] args) {
    Optional<Integer> opt = Optional.ofNullable(2);
    System.out.println(opt.get());
  }
}

ofNullableにnullをセットすると、get()部分でNoSuchElementExceptionエラーとなります。

get()を使う場合はisPresent()メソッドを使用してnullでない場合のみget()できるようにします。

import java.util.Optional;
public class Sample {
  public static void main(String[] args) {
    Optional<Integer> opt = Optional.ofNullable(2);
    if (opt.isPresent()) {
      System.out.println(opt.get());
    }
  }
}

ifPresent

nullチェックしているのと同じなので、ifPresentメソッドと言う便利なメソッドもあります。これはnull出ない場合のみ処理を実行してくれます。

import java.util.Optional;
public class Sample {
  public static void main(String[] args) {
    Optional<Integer> opt = Optional.ofNullable(2);
    opt.ifPresent(e -> System.out.println(e)); // Consumerインタフェース
  }
}

orElse

get()で値を取得した場合、nullを考慮しないといけませんでした。

ifPresentを使えばnull出ない場合のみ処理をしてくれるのですが、orElseメソッドですとnullの場合、第一引数で指定された値を返してくれます。

import java.util.Optional;
public class Sample {
  public static void main(String[] args) {
    Optional<Integer> opt = Optional.ofNullable(2);
    System.out.println(opt.orElse(3));
  }
}

結果は以下のようになります。

2

ofNullableにnullを指定して、orElseに値を指定するとその値が返ります。

以下、例です。

import java.util.Optional;
public class Sample {
  public static void main(String[] args) {
    Optional<Integer> opt = Optional.ofNullable(null);
    System.out.println(opt.orElse(2));
  }
}

結果は以下のようになります。

2

orElseGet

orElse()と同様にorElseGet()を指定して値を取得することができます。

orElseGetは以下のようにSupplier型のラムダ式で渡します。

opt.orElseGet(() -> new Integer(3)); // Supplier

orElseGetのようにデフォルト値をラムダ式で記述することによりnullだった場合のみ処理されます。これがorElseとorElseGetの違いです。

以下、例です。

import java.util.Optional;
public class Sample {
  public static void main(String[] args) {
    Optional<Integer> opt = Optional.ofNullable(null);
    System.out.println(opt.orElseGet(() -> new Integer(3)));
  }
}

結果は以下のようになります。

3

orElseThrow

値がnullの場合、第一引数で指定した例外をスローします。

package jp.co.confrage;

import java.util.Optional;

public class OptionalSample {
  public static void main(String[] args) {
    Integer max = null;
    Optional<Integer> nullableMax = Optional.ofNullable(max);
    nullableMax.orElseThrow(RuntimeException::new); // 例外スローする
  }
}

if文を消す

OptionalクラスのorElseを使えば今までif文でnullチェックをしていた箇所を削除することが出来ます。

package jp.co.confrage;

import java.util.Objects;
import java.util.Optional;

public class OptionalSample {
  public static void main(String[] args) {
    Integer max = Integer.valueOf(1);
    if (Objects.isNull(max)) {
      max = Integer.valueOf(2);
    }
    System.out.println(max); // 1
    // ↓ if文消す
    Optional<Integer> maxtemp = Optional.ofNullable(Integer.valueOf(1));
    max = maxtemp.orElse(Integer.valueOf(2));
    System.out.println(max); // 1
  }
}

コメント

株式会社CONFRAGE ITソリューション事業部をもっと見る

今すぐ購読し、続きを読んで、すべてのアーカイブにアクセスしましょう。

続きを読む

タイトルとURLをコピーしました