JavaでOptionalクラスを使う方法【初心者向け】

初心者向けにJavaでOptionalクラスを使う方法について解説しています。nullを扱う際に便利なクラスですので、基本の書き方を身につけておきましょう。実際にソースコードを書いて説明しているので、ぜひ書いてみてください。

TechAcademyマガジンはオンラインのプログラミングスクールTechAcademy [テックアカデミー]が運営する教育×テクノロジーのWebメディアです。初心者でもすぐ勉強できる記事が2,000以上あります。

OptionalはJava8で追加されたクラスです。

この記事では、JavaのOptionalクラスの使い方を解説します。

 

なお本記事は、TechAcademyのJava講座の内容をもとに作成しています。

 

田島悠介

今回は、Javaに関する内容だね!

大石ゆかり

どういう内容でしょうか?

田島悠介

optionalの使い方について詳しく説明していくね!

大石ゆかり

お願いします!

 

Optionalとは

Optionalはメソッドの戻り値としてnullを返す可能性があることを明示的に示したいときに使用します。

メソッドがnullを返す可能性があるということを示すことで、そのメソッドを利用するプログラムをより安全に実装することができるようになります。

 

Optionalの書き方

Optionalクラスにはインスタンス生成用のstaticメソッドが用意されているので、これらを使って生成します。

Optional.empty() : 値がnullのOptionalインスタンスを生成します
Optional.of(値)  : 値に対するOptionalインスタンス生成します 
Optional.ofNullable(値) : 値が null の場合はempty、nullでない場合はofメソッドの結果と同じ

 

[PR] Javaで挫折しない学習方法を動画で公開中

実際に書いてみよう

メソッドがnullを返す可能性がある処理を書いてみます。

Mapはキーと値を紐づけで管理していますが、Mapから検索を行う際に指定したキーが存在しない場合はnullを返します。

Mapの中に名前をキー、血液型を値として格納し、そのMapから誰が何の血液型かを検索するプログラムを考えてみます。

ソースコード

import java.util.HashMap;
import java.util.Map;

public class OptionalSample {

  //名前と血液型を格納するためのMap
  static Map<String, String> ageMap = new HashMap<String, String>();

  static void setAgeMap(){

    //Mapに3人のデータ(名前と血液型)を格納
    ageMap.put("ロビン","A");
    ageMap.put("アリス", "B");
    ageMap.put("レオナルド", "O");
  }

  public static void main(String[] args) {

    //Mapにデータを格納
    setAgeMap();

    //検索キーとなる名前
    String input = "太郎";

    //Mapから名前をキーに血液型を検索
    String bloodType = checkBloodType(input);

    //名前と取得した血液型を表示
    System.out.println(input + "の血液型は"+ bloodType + "型です。");

  }

  private static String checkBloodType(String input) {

    //Mapから名前をキーに値を検索し、返却する。
    //もしMapの中に該当するキーがない場合はnullを返却する。
    return ageMap.get(input);
  }

}

Mapの中には”ロビン”、”アリス”、”レオナルド”の3人のキーを格納しています。 検索キーを指定し、checkBloodTypeメソッドを使ってMapの中から該当の値を検索します。 checkBloodTypeメソッドの中では、Mapをgetメソッドで検索し、検索結果をそのまま返します。 もし、存在しないキーを指定した場合はcheckBloodTypeの戻り値がnullになります。

上記のサンプルコードでは存在しない”太郎”を検索キーとして指定しています。

実行結果

  太郎の血液型はnull型です。

となってしまいます。

null型という表記はおかしいので、Mapに該当する人物が存在する場合のみ

  〇〇の血液型は〇〇型です。

と表示するように改良します。

checkBloodTypeの戻り値がnullかどうかの判定を加えるので、従来の(Optionalクラスを使わない)実装では、mainメソッドは下記のようになります。

public static void main(String[] args) {

  //Mapにデータを格納
   setAgeMap();

  //検索キーとなる名前
  String input = "太郎";

  //Mapから名前をキーに血液型を検索
  String bloodType = checkBloodType(input);

  //bloodTypeがnullでない場合のみ画面表示
  if(null != bloodType){
    //名前と取得した血液型を表示
    System.out.println(input + "の血液型は"+ bloodType + "型です。");

 }

}

このように書く代わりに、Optionalクラスを使うことでnull判定のコーディングを少なくすることができます。

nullを返す可能性のあるcheckBloodTypeメソッドの戻り値を、StringからOptional<String>に変更します。

checkBloodTypeメソッドは下記のようになります。

private static Optional<String> checkAgeOptional(String input) {

  return Optional.ofNullable(ageMap.get(input));

}

次に、戻り値を受け取り、nullでないことを判定してから表示する部分はこのように記載することができます。

  //Mapから名前をキーに血液型を検索
  Optional<String> bloodtypeOptional = checkAgeOptional(input);

  //bloodtypeOptional がnullでない場合のみ、名前と取得した血液型を表示
  bloodtypeOptional.ifPresent(bloodType -> System.out.println(input + input + "の血液型は"+ bloodType + "型です。"));

checkAgeOptionalの戻り値はOptionalクラスで受け取ります。

ifPresentメソッドを使うと、Optionalクラスの変数の値がnullでない場合だけ()の処理を実行します。

それ以外の場合は何も行いません。 最終コードは以下です。

import java.util.HashMap;
import java.util.Map;
import java.util.Optional;

public class OptionalSample {

  //名前と血液型を格納するためのMap
  static Map<String, String> ageMap = new HashMap<String, String>();

    static void setAgeMap(){

    //Mapに3人のデータ(名前と血液型)を格納
    ageMap.put("ロビン","A");
    ageMap.put("アリス", "B");
    ageMap.put("レオナルド", "O");
  }

  public static void main(String[] args) {

    //Mapにデータを格納
    setAgeMap();

    //検索キーとなる名前
    String input = "太郎";

    //Mapから名前をキーに血液型を検索
    Optional<String> bloodtypeOptional = checkAgeOptional(input);

    //bloodTypeがnullでない場合のみ、名前と取得した血液型を表示
    bloodtypeOptional.ifPresent(bloodType -> System.out.println(input + input + "の血液型は"+ bloodType + "型です。"));

  }

  private static String checkBloodType(String input) {

    //Mapから名前をキーに値を検索し、返却する。
    //もしMapの中に該当するキーがない場合はnullを返却する。
    return ageMap.get(input);
  }

  private static Optional<String> checkAgeOptional(String input) {

    return Optional.ofNullable(ageMap.get(input));
  }

}

存在しないキー”太郎”を設定して検索しているので、実行結果は何も表示されません。

if文を使って書く代わりにOptionalクラスのifPresentメソッドを使うことで、null判定を加えた処理を1行で書くことができました。

 

入門向けJavaの学習サイトもまとめているので、合わせてご覧ください。

 

大石ゆかり

内容分かりやすくて良かったです!

田島悠介

ゆかりちゃんも分からないことがあったら質問してね!

大石ゆかり

分かりました。ありがとうございます!

また、オンラインのプログラミングスクールTechAcademyでは、Java講座を開催しています。

JavaやServletの技術を使ってWebアプリケーションの開発を学ぶことができます。

現役エンジニアがパーソナルメンターとして受講生に1人ずつつき、マンツーマンのメンタリングで学習をサポートし、最短4週間で習得することが可能です。