【发布时间】:2023-03-13 15:40:02
【问题描述】:
我在使用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 of 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***)
但我无法在其中插入返回某些内容的函数。我该怎么做?
大家好 :)
【问题讨论】:
-
你不能从你调用
ifPresent的方法返回,从内部ifPresent:这是lambdas的一个基本限制。您只需使用if检查isPresent(),然后在块中返回。 -
ifPresent 没有返回值。
-
From a Java Language Architect: "例如,你可能永远不应该将它用于返回结果数组或结果列表的东西;而是返回一个空数组或列表。 i>"
-
但我也不能这样做:getAllSomething().ifPresent().stream().anyMatch(something-here) 我想检查列表中的某些内容是否与给定的参数匹配该函数,但仅当列表存在时。
-
干净的代码规则之一:永远不要通过函数返回 NULL。而是抛出异常。如果使用此规则,则根本不需要使用 Optional。