Java 在空流上抛出异常的优雅方法

Java 在空流上抛出异常的优雅方法,java,exception,java-stream,coding-style,Java,Exception,Java Stream,Coding Style,我正在获取客户列表。然后将enity映射到dto并返回结果。我希望在空的客户机列表上抛出异常,但我也希望避免代码中的if语句 我可以将列表包装为可选,但我相信有更优雅的解决方案 Set<ClientDto> clients = Optional.of(repo.findByNumber(number)) .filter(CollectionUtils::isNotEmpty) .orElseThrow(() ->

我正在获取客户列表。然后将enity映射到dto并返回结果。我希望在空的客户机列表上抛出异常,但我也希望避免代码中的if语句

我可以将列表包装为可选,但我相信有更优雅的解决方案

Set<ClientDto> clients = Optional.of(repo.findByNumber(number))
                .filter(CollectionUtils::isNotEmpty)
                .orElseThrow(() -> new NotFoundException())
                .stream()
                .map(client -> new ClientDto(client.getName()))
                .collect(Collectors.toSet());
Set clients=Optional.of(repo.findByNumber(number))
.filter(CollectionUtils::isNotEmpty)
.orelsetrow(()->new NotFoundException())
.stream()
.map(client->newclientdto(client.getName()))
.collect(收集器.toSet());

有没有更干净的解决办法?因为我的代码中几乎没有usless链。我甚至现在开始认为,纯if会更具可读性

我不知道如何处理纯流,但可以定义一个方法,返回列表流,如果流为空则抛出异常

private Stream throwIfEmpty(列表){
if(list.isEmpty()){
抛出新的IllegalArgumentException(“列表不能为空”);
}
返回list.stream();
}
然后您可以通过以下方式使用它:

List clients=throwIfEmpty(repo.findByNumber(number))
.map(client->newclientdto(client.getName()))
.collect(收集器.toSet());

也许这个解决方案让你感到高兴:)

我认为在这里使用
if
比使用流进行体操更合适,因为流操作并不取决于列表是否为空。不管列表是否为空,流操作都将成功。要完成Sweeper指出的内容,请将其格式化为匹配相关代码的行数--
Collection data=repo.findByNumber(number);if(data.isEmpty())抛出新的NotFoundException(“”);设置clients=data.stream().map(client->newclientdto(client.getName()).collect(Collectors.toSet())
比在
可选
@OleV.V中包装要好得多。与问题中收集的数据相比,使用
findAny
会丢失(或不得不再次处理/查询)其余数据。对于代码中的检查,从存储库中进行
存在
应该是更好的查找。我只是认为在Java11+中存在这种情况下的语法糖分,您的解决方案不能以这种方式工作
Optional.stream()
生成包含零个或一个元素的流,即包含的元素。由于该元素应该是您通过
CollectionUtils::isNotEmpty
测试的集合,因此它不能是同时具有
getName()
方法的对象。至少缺少
flatMap
步骤或类似步骤。看起来,您需要执行类似于
Set clients=repo.findByNumber(number).map(client->newclientdto(client.getName()).collect(Collectors.toSet()),所以您应该完全这样做。如果(clients.isEmpty())在之后抛出…
,您可以执行
。我一直在考虑这个问题,但问题是我想抛出业务异常。所以这个方法应该接受然后异常,然后这个代码再次开始看起来比愚蠢的代码更丑陋,如果;(我只是认为在Java11…14中已经有了一些用于这种情况的合成糖