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

nnvyjq4y  于 2023-02-14  发布在  Java
关注(0)|答案(3)|浏览(164)

我在使用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());
}

如您所见,此函数返回ListOptional
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***)

但是我不能在那里插入一个返回值的函数,我该怎么做呢
向大家问好:)

8cdiaqws

8cdiaqws1#

你可以试试

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"方法,甚至不需要加载实体。

crcmnpdw

crcmnpdw2#

以下方法应该有效

Predicate<ComputerProducer> cpPredicate = producer -> producer.getProducerName()
    .equalsIgnoreCase(computerProducer.getProducerName());

boolean compProdExists = getAllCimputerProducers()
    .map(list -> list.stream()
        .filter(cpPredicate)
        .findFirst()))
    .isPresent();
zy1mlcev

zy1mlcev3#

您可以将computerProducer.getProducerName()传递到存储库以获取现有记录。方法名称将为“findByProducerName(String producerName)”,如果producerName具有唯一约束,则返回类型将为Optional<ComputerProducer>,否则为Optional<List<ComputerProducer>>。但是,JPA返回空列表而不是null,因此不需要optional on list。

相关问题