如何解决Java 8流中的IfPresentOrElse场景
我有一个使用嵌套流的场景。 PFB代码:
list.parallelStream()
.filter(item -> productList.parallelStream()
.anyMatch(product -> product.getProductName().equals(item.getProductName())
&& item.getQuantity() <= product.getAvailableQuantity()));
在这里,我试图根据productnames
进行过滤,该方法工作得很好,但是我需要在anymatch中添加else条件。如果找不到匹配项,我需要抛出一个错误“ 找不到产品”。我尝试使用ifPresentOrElse
,但是它使用Consumer
接口作为返回void的参数(但在我的情况下,它必须返回布尔值)。任何帮助表示赞赏。
谢谢。
解决方法
您可以使用orElseThrow
。
orElseThrow(ProductNotFoundException::new)
您不能将orElseThrow()
与anyMatch()
一起使用,因为它返回布尔值。
您可以在findAny()
上使用filter()
,这将返回Optional
,然后可以在orElseThrow()
上使用Optional
引发异常。
例如:
list.parallelStream()
.filter(item -> productList.parallelStream()
.anyMatch(product -> product.getProductName().equals(item.getProductName())
&& item.getQuantity() <= product.getAvailableQuantity()))
.findAny().orElseThrow(ProductNotFoundException::new);
编辑:
OP希望对未找到的第一个产品抛出错误。
list.parallelStream()
.filter(item -> {
if (productList.parallelStream().anyMatch(product -> product.getProductName().equals(item.getProductName())
&& item.getQuantity() <= product.getAvailableQuantity())) {
return true;
} else {
throw new ProductNotFoundException();
}
});
为流执行添加终端操作。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。