我在使用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());
}
如您所见,此函数返回Optional
中的List
。
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***)
但是我不能在其中插入一个返回值的函数。我该怎么办?
关于所有人:)
答案 0 :(得分:1)
您可以尝试类似
private boolean isComputerProducerAlreadyExist(ComputerProducer computerProducer){
return this.getAllComputerProducers()
.map((List<ComputerProducer> computerProducers) -> computerProducers.stream()
.anyMatch(producer -> producer.getProducerName().equalsIgnoreCase(computerProducer.getProducerName())))
.orElse(Boolean.FALSE);
}
或者不加载所有计算机生产者,而是使用其名称加载那些计算机生产者。
private boolean isComputerProducerAlreadyExist(ComputerProducer computerProducer){
return computerProducerRepository.findByName(computerProducer.getProducerName()).isEmpty();
}
据我所知,Spring甚至还不需要加载实体就支持存储库的“现有”方法。
答案 1 :(得分:0)
以下内容应该可以工作,但是我没有什么可以编译的。
Predicate<ComputerProducer> cpPredicate = producer -> producer.getProducerName().equalsIgnoreCase(computerProducer.getProducerName());
boolean compProdExists = getAllCimputerProducers().map(list -> list.stream()
.filter(cpPredicate)
.findFirst()))
.isPresent();
答案 2 :(得分:0)
您可以将computerProducer.getProducerName()
传递到存储库以获取现有记录。方法名称将为'findByProducerName(String producerName)
',如果producerName具有唯一约束,则返回类型将为Optional<ComputerProducer>
,否则为Optional<List<ComputerProducer>>
。但是,JPA返回空列表而不是null,因此列表上的可选项不是必需的。