JDK 1.8新特性のOptionalクラス


前言:最近、他のマイクロサービスから複数の多層エンティティを含むオブジェクトを取得する需要があります.この複雑なオブジェクトの各フィールドを取得する必要があります.チェックしないと、空のポインタが表示される可能性があります.したがって,コードにはnull以外の状況を判断するif elseが多く出現し,そのうちの1つが漏れやすく,空のポインタ異常をもたらす.Optional類はちょうど優雅にこのような問題を解決することができる.Optionalの概要:
A container object which may or may not contain a non-null value.If a value is present, {@code isPresent()} will return {@code true} and {@code get()}will return the value.
Optional        null     。      isPresent()     true,  get()        。Optional     :       T  ,      null。Optional         ,               。Optional               。

Optionalの構築方法:
1.Optional.Of():Optionalオブジェクトを作成します.入力したValueがnullの場合、ポインタが空になります.
2.Optional.ofNullable():Optionalオブジェクトを構築し、nullに入力するとempty()メソッドが自動的に呼び出され、例外を投げ出さずに空のOptionalオブジェクトが作成されます.
 
OptionalAPI:
シーケンス番号
方法&説明
1
static Optional empty()は、空のOptionalインスタンスを返します.
2
boolean equals(Object obj)は、他のオブジェクトがOptionalに等しいか否かを判断する.
3
Optional filter(Predicate super predicate)値が存在し、この値が指定されたpredicateに一致する場合、この値を記述するためにOptionalを返します.そうしないと、空のOptionalを返します.
4
Optional flatMap(Function super T,Optional>mapper)値が存在する場合は、Optionalに含まれるマッピングメソッドに基づく値を返します.そうでない場合は、空のOptionalを返します.
5
T get()このOptionalにこの値が含まれている場合は、値を返します.そうでない場合は、例外を放出します:NoSuchElementException
6
int hashCode()は、値が存在しない場合は0を返すハッシュコードを返します.
7
void ifPresent(Consumer super T>consumer)値が存在する場合は、その値を使用してconsumerを呼び出します.そうしないと、何もしません.
8
boolean isPresent()値が存在する場合、メソッドはtrueを返し、そうでない場合falseを返します.
9
Optional map(Function super T,?extends U>mapper)値がある場合は、呼び出しマッピング関数を実行して戻り値を取得します.戻り値がnullでない場合、マッピング戻り値を含むOptionalをmapメソッド戻り値として作成します.そうでない場合、空のOptionalを返します.
10
static Optional of(T value)はnull以外の値を指定するOptionalを返します.
11
static Optional ofNullable(T value)が空でない場合は、Optional記述の指定値を返します.そうでない場合は、空のOptionalを返します.
12
T orElse(T other)この値が存在する場合は、値を返し、そうでない場合はotherを返します.
13
T orElseGet(Supplier extends T>other)この値が存在する場合は、値を返し、そうでない場合はotherをトリガーし、other呼び出しの結果を返します.
14
T orElseThrow(Supplier extends X> exceptionSupplier)   値が存在する場合は、含まれる値を返します.そうしないと、Supplierによって継承された例外が放出されます.
15
String toString()は、デバッグ用にOptionalの空でない文字列を返します.
Optionalを正しく使用する方法:
まず誤りの例である:この書き方はoptionalクラスを用いない非空処理に比べて本質的にあまり変わらない.大量のif else判断も必要です
   private static String getTypeName(WorkOrderBO workOrderBO){
        Optional optional = Optional.ofNullable(workOrderBO);
        if (optional.isPresent()){
            return workOrderBO.getTypeName();
        }else {
            return " ";
        }
    }

正しい使い方の例:複雑なエンティティに多くの非空チェックが必要な場合、ofNullable()を使用してOptionalクラスを構築します.オブジェクトのフィールドが空の場合でも、NPEを投げ出さずに指定したデフォルト値を返すことができます.たとえば、次のように、workOrderBOの下にあるWorkOrderDataまたはWorkOrderDataの下にあるWorkInfoが空の場合、idは 1999L.余分なif elseで1層1層の検証もフィールドの検証も必要ありません.
Optional optional = Optional.ofNullable(workOrderBO);
Long id = optional.map(WorkOrderBO::getWorkOrderData)
                    .map(WorkOrderData::getWorkInfo)
                    .map(WorkInfo::getId).orElse(1999L);