Throw an Exception If a Stream Has No Result
I Need to Throw an Exception Inside Lambda and I'm Not Sure How to Do It. Here Is My Code So Far: listOfProducts. Stream(). Filter(Product -> Product...
I need to throw an exception inside lambda and I'm not sure how to do it.
Here is my code so far:
listOfProducts
.stream()
.filter(product -> product.getProductId().equalsIgnoreCase(productId))
.filter(product -> product == null) //like if(product==null) throw exception
.findFirst()
.get()
I have no idea how to do that. Is there any way to do this or I just bypass it by applying filter so that filter will not forward null value like
filter(product->product!=null) (even a hint will be useful :))
Edit The actuall question is I need a product and if it is null then it will throw exception otherwise it will pass, it's not mentioned in Java 8 Lambda function that throws exception?
The code I am trying to refactor is
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);
}
I have another possible solution as
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;
}
But I want to solve it using functional interface and it will be good if I can achieve this using one line in this method like
...getProductById()
return stream...get();
and If I need to declare a custom method to declare exception, it won't be an issue
2 Answers
findFirst() returns an Optional so if you want to have your code throw an exception in case you didn't find anything, you should use orElseThrow to throw it.
listOfProducts
.stream()
.filter(product -> product.getProductId().equalsIgnoreCase(productId))
.findFirst()
.orElseThrow(() -> new IllegalArgumentException("No products found with the product id: "+ productId));
Below code would work
listOfProducts
.stream()
.filter(product -> product != null && product.getProductId().equalsIgnoreCase(productId))
.findFirst()
.orElseThrow(() -> new IllegalArgumentException("No products found with the product id: "+ product.getProductId()));
We can write the same with filter chaining as well.
listOfProducts
.stream()
.filter(product -> product != null)
.and(product.getProductId().equalsIgnoreCase(productId)))
.findFirst()
.orElseThrow(() -> new IllegalArgumentException("No products found with the product id: "+ productId));