Javaのオプションクラス

一、背景

1.オプションの主なnullポインタ例外は、問題を解決し、守備のヌルを減らすためにチェックし、明確な決意NULLポインタを避けます

2.オプションのGoogleのグアバクラスに描きます

3. Optinalクラスは、プライマリ値がNULL操作と判断するかどうか、フィールド値を有します

 

第二に、オプションは、クラスのインスタンス、施工方法、静的メソッド3を作成します

1.コンストラクタプライベートオプション(T値)、それはプライベートであり、外部からアクセスすることができないので、それはオブジェクトを作成するためにコンストラクタを呼び出すことはできません、nullポインタ例外が報告されます

    プライベートオプション(T値){
         この .VALUE = Objects.requireNonNull(値)。
    }

()静的メソッドの2、基礎となる通話プライベートコンストラクタ、まだ報告されますnullポインタ例外

パブリック静的<T>オプション<T>(T値)の{ 
新しいオプションの<>(値)を返します。
}

オプション<文字列> optStr1 = Optional.of( "オプション");

ヌルポインタが報告されていない。3.空の()静的メソッドは、ヌル値任意のオブジェクトを返します

パブリック静的<T>オプション<T>空(){ 
@SuppressWarnings( "未チェック")
オプションの<T> T =(オプション<T>)EMPTY。
トンを返します。
}

オプション<文字列> optStr = Optional.empty();

着信値がnullの場合は、オプションが推奨されるように4 ofNullable(下地空に()静的メソッド呼び出し)及び()メソッドは、それがそうでない場合、戻り値がnullでない場合、ヌル値任意のオブジェクトを返します

パブリック静的<T>オプション<T> ofNullable(T値){ 
戻り値== NULL?空の()の(値)。
}

オプション<文字列> optStr2 = Optional.ofNullable(ヌル);

 

三、オプションの使用

1. GET注意して使用()メソッドは、ラップされたオブジェクトの実際の値を返し、ヌル例外はNoSuchElementExceptionをスローします

 

ifPresent対2.isPresent()()

ラップされたオブジェクトの空でないの実際の値かどうかを決定する注意して使用isPresent()メソッド、

IfPresent()メソッドは、値がnullでない場合、オブジェクトを受信する消費者、オブジェクトの実行消費受け入れる()メソッド(パラメータは、戻り値はありません)

注意:オプションを使用しなくても差はないと、理由は裁判官まだnullで、書いてはいけません

ユーザのユーザ= Optional.ofNullable(ユーザ)。
もし(Optional.isPresent()){
    // TODO:何かを行います 
}

 

3.フィルタ()メソッド、受信述語オブジェクト、すなわち、オプションのフィルタオブジェクトの決意条件

オプションの<ユーザー> USER1 = Optional.ofNullable(ユーザ).filter(U  - > u.getName()の長さ()<6。)。

 

4.マップ()対flatMap()値変換

地図()メソッドは、受信機能オブジェクト<?スーパーTは,? Uを拡張>、関数は、関数によって計算されます

機能機能によって計算さflatMap()メソッドの機能を受信するための<?スーパーT、オプションの<U >>オブジェクト、

 

5. orelse()orElseThrow対orElseGet()(VS)

orElse()メソッドは、値がヌルである、デフォルト値が返され、値がnullでない場合でも、依然として(orElseを行う)、推奨されません

orElseGet()メソッドは、オブジェクトを受け取るサプライヤ()メソッドは、デフォルト値のサプライヤーとして使用される値がnullでない場合に、オブジェクトを取得し、orElseGet()を実行しないが、推奨されます

orElseThrow()メソッドは、受信サプライヤオブジェクト、オブジェクトは、例外サプライヤを返す必要があります

 

4、実際のシーン

1。 

公共の文字列getCity(ユーザユーザ)が   スロー例外を{
         場合(!ユーザー= ヌル){
             場合(user.getAddress()!= nullの){ 
                アドレスアドレス = user.getAddress();
                もし(!address.getCity()= nullを){
                     返す)(address.getCityを。
                } 
            } 
        } 
        スロー 新しい Excpetionを( "取值错误" ); 
} 

パブリック文字列getCity(ユーザユーザ)スロー例外{
     リターンOptional.ofNullable(ユーザ)
                   .MAP(U - > u.getAddress())
                   .MAP( - > a.getCity())
                   .orElseThrow(() - > 新しい例外( "取指错误" )); 
}

 

2。 

もし(ユーザ!= NULL ){ 
    doSomethingの(ユーザ)。
} 

Optional.ofNullable(ユーザ)
         .ifPresent(U - > { 
            doSomethingの(U); 
});

 

3。 

パブリックユーザーのgetUser(ユーザユーザ)はスロー例外{
     場合(!ユーザー= ヌル){ 
        文字列名を = user.getName();
        もし( "zhangsan" .equals(名)){
             戻りユーザ。
        } 
    } { 
        ユーザ = 新しいユーザー(); 
        user.setName( "zhangsan" );
        リターンユーザー; 
    } 
} 

パブリックユーザのgetUser(ユーザユーザ){
     戻りOptional.ofNullable(ユーザ)
                   .filter(U- > "zhangsan" .equals(u.getName()))
                   .orElseGet(() - > { 
                        ユーザーUSER1 = 新しいユーザー(); 
                        user1.setName( "zhangsan" );
                         戻りUSER1; 
                   }); 
}

 

 

 

 

参考: 

https://www.jianshu.com/p/d81a5f7c9c4e

https://www.cnblogs.com/rjzheng/p/9163246.html

 

おすすめ

転載: www.cnblogs.com/june0816/p/11442923.html