Java 当尝试查找元素时,如何使用列表上的流引发异常?

Java 当尝试查找元素时,如何使用列表上的流引发异常?,java,list,exception,java-stream,optional,Java,List,Exception,Java Stream,Optional,当我按条件找到元素时,我想使用流抛出一个异常 myList.stream() .filter(d -> (d.getNetPrice() != new BigDecimal(0))) .findAny() .orElseThrow( () -> new DocumentRequestException("The product has 0 'NetPrice' as a value")); 请求 { "sku

当我按条件找到元素时,我想使用流抛出一个异常

 myList.stream()
      .filter(d -> (d.getNetPrice() != new BigDecimal(0)))
      .findAny()
      .orElseThrow(
          () -> new DocumentRequestException("The product has 0 'NetPrice' as a value"));
请求

{
        "sku": "123",
        "quantity": 3,
        "description": "pc",
        "netPrice": 16806,
        "amount": 50418
    },
    {
        "sku": "1234",
        "quantity": 2,
        "description": "notebook",
        "netPrice": 0,
        "amount": 0
    }
因此,对于该示例,我希望出现异常,因为该列表包含一个“netPrice”=0的元素,但代码返回Pc元素,而没有发生任何其他情况


如何修复它?

您可以使用
anyMatch
执行
if
检查并抛出异常,如下所示:

if(myList.stream().anyMatch(d -> d.getNetPrice().equals(BigDecimal.ZERO)) {
    throw new DocumentRequestException("The product has 0 'NetPrice' as a value")
}

您可以使用
anyMatch
执行
if
检查并抛出异常,如下所示:

if(myList.stream().anyMatch(d -> d.getNetPrice().equals(BigDecimal.ZERO)) {
    throw new DocumentRequestException("The product has 0 'NetPrice' as a value")
}

您的代码使用
orelsetrow
,如果不存在可选项,即未找到任何元素,则会抛出。使用ifPresent()。或者将if块与anyMatch一起使用。不要将对象与
=
进行比较。通常使用equals(),并将compareTo与BigDecimal一起使用。如果我可以添加一件事来改进代码,那么我建议您不要使用异常来控制代码。还要注意,BigDecimal.ZERO是存在的。您的代码使用
orElseThrow
,如果缺少可选项,即未找到任何元素,则会抛出。使用ifPresent()。或者将if块与anyMatch一起使用。不要将对象与
=
进行比较。通常使用equals(),并使用compareTo和BigDecimal。如果我可以添加一件事来改进您的代码,那么我建议您不要使用异常来控制您的代码。还要注意BigDecimal.ZERO是存在的。这个答案有效,但orElseThrow会发生什么情况?@TuGordoBello我在您问题下的第一条评论中解释道,21分钟前,谢谢@TuGordoBello这个答案有效,但orElseThrow会怎么样?@TuGordoBello我在21分钟前你问题下的第一条评论中解释了这一点。@JBNizet谢谢@图戈多贝洛