如何使用 Optional.ifPresent return 布尔值
How can I return boolean value using Optional.ifPresent
我在使用 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
.
的 returns 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***)
但我无法在其中插入 returns 某些功能。我该怎么做?
向大家问好:)
你可以试试
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 还支持 "exist" 存储库方法,甚至不需要加载实体。
下面应该可以,但我没有任何东西可以编译它。
Predicate<ComputerProducer> cpPredicate = producer -> producer.getProducerName().equalsIgnoreCase(computerProducer.getProducerName());
boolean compProdExists = getAllCimputerProducers().map(list -> list.stream()
.filter(cpPredicate)
.findFirst()))
.isPresent();
您可以将 computerProducer.getProducerName()
传递给存储库以获取现有记录。方法名称将为“findByProducerName(String producerName)
”,如果 producerName 具有唯一约束,则 return 类型将为 Optional<ComputerProducer>
,否则为 Optional<List<ComputerProducer>>
。但是,JPA return 的空列表而不是 null,因此不需要列表上的可选。
我在使用 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***)
但我无法在其中插入 returns 某些功能。我该怎么做?
向大家问好:)
你可以试试
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 还支持 "exist" 存储库方法,甚至不需要加载实体。
下面应该可以,但我没有任何东西可以编译它。
Predicate<ComputerProducer> cpPredicate = producer -> producer.getProducerName().equalsIgnoreCase(computerProducer.getProducerName());
boolean compProdExists = getAllCimputerProducers().map(list -> list.stream()
.filter(cpPredicate)
.findFirst()))
.isPresent();
您可以将 computerProducer.getProducerName()
传递给存储库以获取现有记录。方法名称将为“findByProducerName(String producerName)
”,如果 producerName 具有唯一约束,则 return 类型将为 Optional<ComputerProducer>
,否则为 Optional<List<ComputerProducer>>
。但是,JPA return 的空列表而不是 null,因此不需要列表上的可选。