Javaで複数のヌルチェックを処理する良い方法はありますか?

user11412208:

私は、コードの下に持っています

Set<Product> getallProducts(){

    Product p = getProduct(brand, price);
    Product p1 = getProduct(brand, price, location);
    Product p2 = getProduct(brand, price, qty);

   Set<SuperProducts> superProducts = new HashSet<>;


   if(p!=null){
      SuperProduct sp  = getSuperProduct(p)
      superProducts.add(sp)
   }

   if(p1!=null){
      SuperProduct sp1  = getSuperProduct(p1)
      superProducts.add(sp)

   }

   if(p2!=null){
      SuperProduct sp2  = getSuperProduct(p2)
      superProducts.add(sp2)

    }
}

ハンドルPへの明確な方法はあります!= nullを、P2!= nullを、P1!= nullを。私は、リストにP、P1、P2を追加することができますし、反復をそれを介して以下のように、私はそれらを反復処理し、リストに製品を追加し、より安価な方法を探していましたか。?毎回リストに追加し、それを反復処理よりも高価であるヌルをチェックする場合にも、私が好きなのでしょうか?

List<Product> products = new ArrayList<>():
products.add(p);
products.add(p1);
products.add(p2);

and 
for(Product p:products){
// and adding to superProducts
}
スティーブンC:

あなたはこれを行うための最もパフォーマンスの方法、あなたは現在、それをやっているような方法でスティックを探している場合。あなたのソリューションは、おそらくそれができる限り効率的に冗長ですが、。そして、あなたのコードは、他の選択肢よりも理解しやすいであることは間違いありません。

あなたが少ないコード行を使用するソリューションを探しているなら、あなたは、またはの配列またはリスト作成することで、この使用してストリームとフィルタを実装することができますProduct参照をして反復します。しかし、これらのソリューションは、すべて伴う一時的なデータ構造を作成し、実質的に少ない効率的です。


場合ことを注意getSuperProduct(p)コールがJITコンパイラによってインライン化されて、ためにimplictテストを離れて最適化することができるかもしれないnullことが呼び出しで発生します。


毎回リストに追加し、それを反復処理よりも高価であるヌルをチェックする場合にも、私が好きなのでしょうか?

私は、あなたが逆のケースで見つけると思います。あなたはどちらの場合にはnullチェックを行う必要がある(またはしない...上記参照)します。あなたは、リスト、配列またはストリームを使用しようとすると、(1つまたは複数の新しいヒープを作成および初期化するオブジェクト)のデータ構造を作成するオーバーヘッドを持っている、とあなたはオーバーヘッドあなたがリストの最後に得ているときのテストの持っています/アレイ/ストリーム。


ノートの最後にもう一つの事は、このようなコードの効率は、多くの場合、重要ではないということです。私たちは、おそらく100の未満の命令の違いについて話しています。つまり、1マイクロ秒未満差。これは、アプリケーションが何をしているかの残りの部分と比較して、おそらく簡単です。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=172039&siteId=1