web-dev-qa-db-ja.com

ストリームに結果がない場合は例外をスローします

ラムダ内で例外をスローする必要がありますが、その方法がわかりません。

これまでの私のコードは次のとおりです。

_listOfProducts
.stream()
.filter(product -> product.getProductId().equalsIgnoreCase(productId))
.filter(product -> product == null) //like if(product==null) throw exception
.findFirst()
.get()
_

どうすればいいのかわかりません。これを行う方法はありますか、それともフィルターを適用してバイパスし、フィルターがfilter(product->product!=null)のようなnull値を転送しないようにします(ヒントでも役立ちます:))

Edit実際の質問は、製品が必要であり、それがnullの場合は例外をスローし、そうでない場合は合格します。 例外をスローするJava8 Lambda関数?

私がリファクタリングしようとしているコードは

_for(Product product : listOfProducts) {
  if(product!=null && product.getProductId()!=null &&
      product.getProductId().equals(productId)){
    productById = product;
    break;
  }
}
if(productById == null){
  throw new IllegalArgumentException("No products found with the
    product id: "+ productId);
}
_

私は別の可能な解決策を持っています

_public Product getProductById(String productId) {
        Product productById = listOfProducts.stream()
                .filter(product -> product.getProductId().equalsIgnoreCase(productId)).findFirst().get();

        if (productById == null)
            throw new IllegalArgumentException("product with id " + productId + " not found!");

        return productById;
    }
_

しかし、私は関数型インターフェースを使用してそれを解決したいと思っています。この方法で1行を使用してこれを達成できれば良いでしょう。

_...getProductById()
return stream...get();
_

例外を宣言するためにカスタムメソッドを宣言する必要がある場合、それは問題にはなりません

13
user6601906

findFirst()Optional を返すため、何も見つからなかった場合にコードで例外をスローさせたい場合は、 orElseThrow それを投げます。

listOfProducts
.stream()
.filter(product -> product.getProductId().equalsIgnoreCase(productId))
.findFirst()
.orElseThrow(() -> new IllegalArgumentException("No products found with the  product id: "+ productId));
18
Didier L