Javaの8オプションの正しい姿勢(RPM)

オプションJava8がnullのセキュリティAPIの問題を解決するために設けられています。オプションは醜いデザインは非常にエレガントになり、私たちは退屈のコードロットを十分に活用することができます。

我々はまだ、次の方法でオプションを使用している場合、あなたは自分自身を表示するために開始する必要があります

isPresent()メソッドを呼び出したときに
呼び出したときに()メソッドを取得するための
クラス/インスタンスとして、任意のタイプの属性
パラメータ法としてオプションの種類を
isPresent()とOBJを!= nullがいかなる種類の区別なく、私たちの生活は、まだステップバイステップ驚くべき。そして、いやされていますisPresent()は警告が表示されますのIntelliJ IDEAのGet()呼び出しの道を開きます。前isPresentなしコールOptional.get()使用前に()の値が利用可能であるかどうかをチェックする。値が含まれていないオプションの場合は、取得する()例外がスローされます!
IntelliJ IDEAパラメータプロパティやメソッドなどの任意のタイプは、より強く推奨されていません!
フィールドまたはメソッドのような画像の任意のタイプの任意の使用は、望ましいパラメータはありません。オプションのみライブラリ設計プロセスは、戻り値の型はそうでなくてもよいことは明らかであってもよい。フィールドタイプであるような配列の任意のタイプを使用することができません問題!
右のようになります。

場所を使用しないようにしてください:
1、回避するには、この方法では、ヌル= OBJ差はないので、それほど無い感覚で、例があるかどうかを確認するためにOptional.isPresent()を使用して!
2は、インスタンスがあるかどうかを確認するためOptional.isPresentを()を使用する前に使用する必要性、そこだろうNPEの問題をオブジェクトのインスタンスを取得するOptional.get()方法の使用を避けます。
3、クラスまたはインスタンスオプションの属性の使用を避けますが、戻り値が返さパッケージインスタンスオブジェクトで使用する必要があります。
図4に示すように、パラメータオプション、3と同じ理由の方法の使用を避けます。

 

以下は、最も簡単な例として、いくつかの例を示します。

//しかし、気取って書き換えないでください。
静的文字列のgetName公開(ユーザU){
IF(U == NULL || u.name == NULL)
リターン"不明";
u.nameを返す;
}


パブリック静的文字列のgetName(ユーザU){
オプションザ<ユーザー>ユーザー= Optional.ofNullable(U);
IF(!user.isPresent())
リターン"不明";
戻りuser.get()名前;.
}
//これまでの単純なものから書き直され、その動作が同じで、最初のコードです。== nullのをuと交換するより方法よりIsPresent何もありません。これは、正しい使用方法オプションのリライトはありませんが、我々は再び書き直します。

静的文字列のgetName公開(ユーザU){
戻りOptional.ofNullable(U)
.MAP(USER-> user.name)
.orElse( "不明");
}

//このオプションの使用が正しい姿勢です。さて、思考のこのラインによると、私たちは安全の裁判官層ではなく、呼び出しを連鎖させることができます
上記の他に例であり、以下は私が書いたものの一例は以下のとおりです。

//パラメータチェック
のpublic static無効メイン(文字列[] args){
文字列ID = NULLを、
Optional.ofNullable(ID).filter(のStringUtils :: isNoneBlank)
.orElseThrow(() - > RuntimeExceptionは、新しい新しい(「IDができません空「));

}
 

オブジェクトパラメータの検証。

パッケージコム;

輸入org.apache.commons.lang3.StringUtils。
輸入java.util.Collections。
輸入はjava.util.List;
輸入java.util.Optional;

/ **
* @author ZK
* @description:
* @date 2019年11月20日15:49
* /
publicクラスデモ{


パブリック静的無効メイン(文字列[] args){

ユーザーユーザ=新しいユーザー(18、「程程「);

オプションの<ユーザー>オプション= Optional.ofNullable(ユーザ)。
//校验ID和名是否为ヌル
。optional.map(USER1 - > user1.getId())orElseThrow(() - >新しいのRuntimeException( "ID不能为空"));
。optional.filter(USER1 - > StringUtils.isNoneBlank(user1.getName()))orElseThrow(() - >新しいのRuntimeException( "名字不能为空"));

ユーザーuser2の=新しいユーザー();
オプションの<ユーザ> optionalUser = Optional.ofNullable(USER2);
//チェックパラメータ
//optionalUser.map(u->u.getId()).orElseThrow(()->newのRuntimeException( "idは空にすることはできません") );
//optionalUser.filter(u->StringUtils.isNotBlank(u.getName())).orElseThrow(()->newのRuntimeException( "nameが空にすることはできません"));

//デフォルト値の取得
文字列をanElse = optionalUser 。.MAP(U - > u.getName( ))orElse( " デフォルトの名前");
System.out.printlnは(anElse);

// ....へのアクセスに空
optionalUser.orElseGet(() - >新しい新しいですユーザー(18、 "チェンチェン"));

//プロセスが存在するものやっている
optionalUser.ifPresent(U - > u.setName(u.getName()+ "123"));

//デフォルト値が存在しない返す
optionalUserを.MAP(U - > u.getMoneyList() )orElse(Collections.emptyList());.
/ **
//私たちの上のJava 8の前に同様の慣行を避ける
{IF(optionalUser.isPresent())
。optionalUser.getリターン()getOrders();
}他{
リターンCollections.emptyList();
}
/ *

現在の処理の//名前
optionalUser.map(U - > u.getName() )マップ(名前- 。 > name.toUpperCase())orElse(ヌル);.
/ **
ユーザーユーザー..... =
IF(ユーザー= NULL){!
文字列名= user.getUsername();
!IF(名= NULL){
リターンname.toUpperCase();
}他{
リターンNULL;
}
}他{
リターンNULL;
}
* /



//は三つのパラメータをチェック
ユーザーUSER3 =新しいユーザー(ヌル、 " チェンチェン"、 "大");
オプション。 ofNullable(USER3).filter(U - > StringUtils.isNotBlank(u.getName()))
.filter(U - > StringUtils.isNotBlank(u.getLocation()))
.MAP(U - > u.getId())orElseThrow(() - >新しいのRuntimeException( "ユーザー中属性不能为空"));


}


静的クラスユーザー{
プライベート整数ID。
プライベート文字列名;
プライベート文字列の場所。
プライベートリスト<文字列> moneyList。

パブリックリストの<string> getMoneyList(){
戻りmoneyList。
}

公共ボイドsetMoneyList(リストの<string> moneyList){
this.moneyList = moneyList。
}

パブリック文字列のgetLocation(){
戻り場所、
}

公共ボイドのsetLocation(文字列の位置){
this.location =場所。
}

パブリック整数のgetId(){
戻りID。
}

公共ボイドSETID(整数ID){
this.id = ID。
}

パブリック文字列のgetName(){
戻り名。
}

公共ボイドのsetName(文字列名){
this.name =名。
}

パブリックユーザ(整数ID、文字列名){
this.id = ID。
this.nameは名称。
}

パブリックユーザ(){
}

パブリックユーザ(整数ID、文字列名、文字列の位置){
this.id = ID。
this.nameは名称。
this.location =場所。
}
}


}
 

私はあなたには、いくつかのインスピレーションを見つけることを願って、他の記事からコンテンツについて。

マップ機能壮大なデビュー
user.isPresent()がtrueの場合、その注文の関連するセット、および偽リターン空のセットをマッピングします、我々はそれが元のマップ機能の責任であるときorElseGet方法が弱い、orElse上使用、我々は行することができます

user.mapリターン(U - > u.getOrders())。orElse(Collections.emptyList())
 
//私たちの上に8前のJavaと同様の慣行を避ける
IF(user.isPresent()){
  リターンuser.get() .getOrders();
}他{
  リターンCollections.emptyList();
}

マップは、大文字でユーザー名を取得するために、より深いレベルのような潜在的に無限のカスケードであります

user.mapリターン(U - > u.getUsername())
           .MAP(名- > name.toUpperCase())
           .orElse(NULL);
//これは、過去に入れることがあり、各レベルのニーズを入れてコールを拡大しますヌル値を決定

ユーザーユーザー..... =
IF(!ユーザー= NULL){
  文字列名= user.getUsername();
  IF {(名= NULL!)
    リターンname.toUpperCase();
  }そうでなければ{
    戻りヌル。
  }
}他{
  戻りNULL;
}

フィルタ():条件が満たさと値オプションを含むこと値戻りを有し、そうでない場合はオプションを空の場合。

任意の<string> LONGNAME = name.filter((値) - > value.length()> 6)。  
System.out.println(longName.orElse( "名前が6文字未満である")); //输出Sanaulla  

flatMap():
値、その実装のマッピングタイプオプションの戻り値の関数がリターンがあれば、そうでない場合は空のオプションを返します。flatMapマップ(目的球)メソッドと同様に、マッパーflatMapの戻り値は省略可能でなければならないことを除いて。コールの終了、flatMapはオプションパッケージにはなりません。
同様の方法は、関数の戻り値が異なるマッピングすることを除いて、方法をマップflatMap。マッピング関数の戻り値マップは、任意のタイプのTであってもよく、機能マッピング方法はflatMapオプションでなければなりません。

= name.flatMap upperName((値) - > Optional.of(value.toUpperCase()));  
のSystem.out.println(upperName.orElse( "いいえ値が見つかった")); //出力SANAULLA
----- -----------
免責事項:この記事は元の記事CSDNブロガー「川」で、CC 4.0 BY-SAの著作権契約書に従って、再現し、元のソースのリンクと、この文を添付してください。
オリジナルリンクします。https://blog.csdn.net/u010398771/article/details/103165917

おすすめ

転載: www.cnblogs.com/yngjian/p/12119484.html