Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
5
Help us understand the problem. What is going on with this article?
@uchi_y

いまさら始めるJava8 ~Optional~

More than 1 year has passed since last update.

第1回:いまさら始めるJava8 ~forEachとラムダ式~
第2回:いまさら始めるJava8 ~StreamAPI~
第3回:いまさら始めるJava8 ~日付時刻API~

Optionalとは、null以外の値を持つかもしれないし、持たないかもしれないものを扱うクラスです
Optional<String>は何か文字列を持つかもしれないし、持たないかもしれないという型です

Optionalの生成

値を持たない

Optional emptyCase = Optional.empty();

空のOptionalを生成します

値を必ず持つ

Optional presentCase = Optional.of("example");

値を持つOptionalを生成します
引数にnullを渡した場合、NullPointerExceptionが発生します

値を持つかもしれないし、持たないかもしれない

Optional nullableNullCase = Optiona.ofNullable(null);
Optional nullableNotNullCase = Optiona.ofNullable("example");

引数がnullであれば空のOptionalを、そうでなければ引数の値を持つOptionalを生成します

Optionalの利用

値があるか判定する

isPresent

値を持つ場合はtrue, 持たない場合はfalseを返します

Optional presentCase = Optional.of("example");
presentCase.isPresent();  // true

Optional emptyCase = Optional.empty();
emptyCase.isPresent();  // false

ifPresent

値を持つ場合は引数のConsumerを値を引数にとって実行し、持たない場合は何もしません

Optional presentCase = Optional.of("example");
presentCase.ifPresent(s -> {System.out.println(s)});  // 標準出力に"example"と出力

Optional emptyCase = Optional.empty();
emptyCase.ifPresent(s -> {System.out.println(s)});  // 何もしない

値を取得する

get

値を持つ場合はその値を返し、値を持たない場合はNoSuchElementExceptionがthrowされます

Optional presentCase = Optional.of("example");
presentCase.get();                    // example

Optional emptyCase = Optional.empty();
emptyCase.get();                      // NoSuchElementException が発生

値を持つことを期待している場合に使います
値を持たない場合にデフォルト値を使いたい場合は次のorElseを使ったほうがよいです

orElse

値を持つ場合はその値を返し、値を持たない場合は引数で指定した値を返します

Optional presentCase = Optional.of("example");
presentCase.orElse("default");                    // example

Optional emptyCase = Optional.empty();
emptyCase.orElse("default");                      // default

orElseGet

値を持つ場合はその値を返し、値を持たない場合は引数で指定したSupplierの結果を返します

Optional presentCase = Optional.of("example");
presentCase.orElseGet(() -> {"default"});          // example

Optional emptyCase = Optional.empty();
emptyCase.orElseGet(() -> {"default"});           // default

orElseとの違いは、デフォルト値を直接渡すかラムダ式で表すかです

orElseThrow

値を持つ場合はその値を返し、値を持たない場合は引数で指定したSupplierで例外をthrowします

値を利用する

map

値を持つ場合は引数のマッピング関数をその値に適用し、結果がnullでなければ結果を記述するOptionalを返します。それ以外の場合は空のOptionalを返します

Optional<String> presentCase = Optional.of("example,1,exp");
Optional<String[]> result = presentCase.map(name -> name.split(",")); // [example, 1, exp]

Optional<String> emptyCase = Optional.empty();
Optional<String[]> result = emptyCase .map(name -> name.split(",")); // 空のOptional

filter

StreamAPIのfilterと同じような働きをします
引数のラムダ式の条件に一致する場合は元のOptionalを返し、そうでない場合は空のOptionalを返します

Optional<String> presentCase =Optional.of("example");
Optional<String> match = presentCase.filter(exp -> exp.length() == 7); // "example"

Optional<String> notMatch = presentCase.filter(exp -> exp.length() != 7); // 空のOptional
5
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
uchi_y
わかってるようでわかってないことを埋めていきたい

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
5
Help us understand the problem. What is going on with this article?