Java 8のOptionalによるNull処理(jdk 1.7との比較)

3007 ワード

1.optionalオブジェクトの作成
Empty()メソッドは、値のないOptionalオブジェクトを作成するために使用されます.
Optional emptyOpt = Optional.empty();

of()メソッドは、空でない値を使用してOptionalオブジェクトを作成します.
String str = "Hello World";
Optional notNullOpt = Optional.of(str);

ofNullable()メソッドはnullの値を受信します.
Optional nullableOpt = Optional.ofNullable(str);

2.判断Null
isPresent()
作成したオブジェクトに値がない場合、isPresent()メソッドを呼び出すとfalseが返され、get()メソッドを呼び出すとNull PointerException例外が放出されます.
3.オブジェクトの取得
get()
4.mapを使用してオブジェクトの値を抽出する
UserオブジェクトのroleIdプロパティ値を取得する場合は、直接取得するのが一般的です.
String roleId = null;
if (user != null) {
 roleId = user.getRoleId();
}

Optionalで提供されるmap()メソッドを使用すると、より簡単な方法で実現できます.
Optional userOpt = Optional.ofNullable(user);
Optional roleIdOpt = userOpt.map(User::getRoleId);

5.orElseメソッドを使用してデフォルト値を設定する
Optionalクラスには、次のような値を取得するための他のメソッドも含まれています.
  • orElse():値がある場合は戻り、そうでない場合はデフォルト値として指定された値を返します.
  • orElseGet():orElse()メソッドと同様に、デフォルト値を生成する方法が異なる点が異なります.この方法は、デフォルト値を生成するためのSupplier extends>関数インタフェースパラメータを受け入れる.
  • orElseThrow():前述したget()メソッドと同様に、nullの値がある場合に呼び出される両方のメソッドは、Null PointerException例外を放出します.このメソッドが放出する例外タイプを指定できるのとは異なります.
  • String str = "Hello World";
    Optional strOpt = Optional.of(str);
    String orElseResult = strOpt.orElse("Hello Shanghai");
    String orElseGet = strOpt.orElseGet(() -> "Hello Shanghai");
    String orElseThrow = strOpt.orElseThrow(
     () -> new IllegalArgumentException("Argument 'str' cannot be null or blank."));
    

    6.filter()メソッドでフィルタ
    filter()メソッドは、Optionalオブジェクトが所定の条件を満たしているかどうかを判断するために使用でき、一般的に条件フィルタリングに使用されます.
    Optional optional = Optional.of("[email protected]");
    optional = optional.filter(str -> str.contains("164"));
    

    上記のコードでは、filter()メソッドのLambda式が成立すると、filter()メソッドは現在のOptionalオブジェクト値を返します.そうでない場合、値が空のOptionalオブジェクトを返します.
    7.使用上の推奨事項
  • プログラムでOptionalオブジェクトを直接呼び出すget()メソッドとisPresent()メソッドをできるだけ避ける.
  • Optionalタイプを使用してエンティティクラスの属性を宣言することを避ける.

  • 8.正しい例
    orElse()メソッドの使用
    return str != null ? str : "Hello World"
    

    上記のコードは、文字列strが空であるか否かを判断し、空でない場合に返す、そうでない場合に定数を返すことを示す.Optionalクラスを使用すると、次のように表示されます.
    return strOpt.orElse("Hello World")
    

    if-elseの簡略化
    User user = ...
    if (user != null) {
     String userName = user.getUserName();
     if (userName != null) {
     return userName.toUpperCase();
     } else {
     return null;
     }
    } else {
     return null;
    }
    

    上記のコードは、次のように簡略化できます.
    User user = ...
    Optional userOpt = Optional.ofNullable(user);
    return user.map(User::getUserName)
     .map(String::toUpperCase)
     .orElse(null);