如何使用 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,因此不需要列表上的可选。