如何使用Optional.ifPresent返回布尔值

时间:2019-07-01 12:27:16

标签: java spring optional

我在使用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***)

但是我不能在其中插入一个返回值的函数。我该怎么办?

关于所有人:)

3 个答案:

答案 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,因此列表上的可选项不是必需的。