我在使用Optional.ifPresent
语句时遇到了一些问题。我想减少NullPointerExceptions
的数量,所以我决定使用Optional
值。
此外,我还试图避免使用if
语句反模式。
所以我实现了Optional.isPresent
语句,但它并不是我所期望的。
请看这些列表:
这是我服务的一部分:
if (getAllComputerProducers().isPresent()) {
if (isComputerProducerAlreadyExist(computerProducer))
return new ResponseEntity<>(HttpStatus.CONFLICT);
}
computerProducerRepository.save(computerProducer);
return new ResponseEntity<>(HttpStatus.CREATED);
getAllComputerProducers
函数如下所示:
private Optional<List<ComputerProducer>> getAllComputerProducers() {
return Optional.ofNullable(computerProducerRepository.findAll());
}
如您所见,此函数返回List
的Optional
。isComputerProducerAlreadyExist
函数的实现方式如下:
private boolean isComputerProducerAlreadyExist(ComputerProducer computerProducer) {
return getAllComputerProducers()
.get()
.stream()
.anyMatch(producer -> producer.getProducerName()
.equalsIgnoreCase(computerProducer.getProducerName()));
}
这是这么多的代码,我相信它可以做得更简单。我的目标是减少代码到一行命令如下:
getAllCimputerProducers().ifPresent(***and-here-some-anyMatch-boolean-function***)
但是我不能在那里插入一个返回值的函数,我该怎么做呢
向大家问好:)
3条答案
按热度按时间8cdiaqws1#
你可以试试
或者不是加载所有的计算机生产商只加载那些使用它的名字。
据我所知,Spring还支持存储库的"exist"方法,甚至不需要加载实体。
crcmnpdw2#
以下方法应该有效
zy1mlcev3#
您可以将
computerProducer.getProducerName()
传递到存储库以获取现有记录。方法名称将为“findByProducerName(String producerName)
”,如果producerName具有唯一约束,则返回类型将为Optional<ComputerProducer>
,否则为Optional<List<ComputerProducer>>
。但是,JPA返回空列表而不是null,因此不需要optional on list。