如果流没有结果,则引发异常

2022-09-02 09:39:09

我需要在lambda中抛出一个异常,我不知道该怎么做。

这是我到目前为止的代码:

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

我不知道该怎么做。有没有办法做到这一点,或者我只是通过应用过滤器绕过它,这样过滤器就不会像空值那样转发空值(即使提示也会有用:))filter(product->product!=null)

编辑实际问题是我需要一个产品,如果它为空,那么它将引发异常,否则它将通过,在Java 8 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;
    }

但是我想使用功能接口来解决它,如果我可以在这种方法中使用一行来实现这一点,那就太好了

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

如果我需要声明一个自定义方法来声明异常,那将不是问题


答案 1

findFirst()返回一个 Optional,因此,如果您希望代码在未找到任何内容时引发异常,则应使用 orElseThrow 来抛出它。

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

答案 2

下面的代码可以工作

 listOfProducts
.stream()
.filter(product -> product != null &&   product.getProductId().equalsIgnoreCase(productId))
.findFirst()
.orElseThrow(() -> new IllegalArgumentException("No products found with the  product id: "+ product.getProductId()));

我们也可以用过滤器链接来写同样的东西。

listOfProducts
.stream()
.filter(product -> product != null)
.and(product.getProductId().equalsIgnoreCase(productId)))
.findFirst()
.orElseThrow(() -> new IllegalArgumentException("No products found with the  product id: "+ productId));

推荐