猿问

如何使用 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());

}

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

但我不能在那里插入一个返回某些东西的函数。我该怎么做?


问候大家:)


子衿沉夜
浏览 213回答 3
3回答

不负相思意

你可以尝试类似的东西private boolean isComputerProducerAlreadyExist(ComputerProducer computerProducer){&nbsp; &nbsp; return this.getAllComputerProducers()&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .map((List<ComputerProducer> computerProducers) -> computerProducers.stream()&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .anyMatch(producer -> producer.getProducerName().equalsIgnoreCase(computerProducer.getProducerName())))&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .orElse(Boolean.FALSE);}或者不是加载所有计算机生产商,而是只加载使用其名称的计算机。private boolean isComputerProducerAlreadyExist(ComputerProducer computerProducer){&nbsp; &nbsp; return computerProducerRepository.findByName(computerProducer.getProducerName()).isEmpty();}据我所知,Spring 还支持存储库的“存在”方法,甚至不需要加载实体。

慕桂英3389331

以下应该工作Predicate<ComputerProducer> cpPredicate = producer -> producer.getProducerName()&nbsp; &nbsp; .equalsIgnoreCase(computerProducer.getProducerName());boolean compProdExists = getAllCimputerProducers()&nbsp; &nbsp; .map(list -> list.stream()&nbsp; &nbsp; &nbsp; &nbsp; .filter(cpPredicate)&nbsp; &nbsp; &nbsp; &nbsp; .findFirst()))&nbsp; &nbsp; .isPresent();

杨__羊羊

您可以将 传递computerProducer.getProducerName()给存储库以获取现有记录。方法名称将为 '&nbsp;findByProducerName(String producerName)',如果 producerName 具有唯一约束,则返回类型将为Optional<ComputerProducer>, else&nbsp;Optional<List<ComputerProducer>>。但是,JPA 返回空列表而不是 null,因此不需要 optional on list。
随时随地看视频慕课网APP

相关分类

Java
我要回答