为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

子衿沉夜 2023-03-02 10:01:31
我在使用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 回答

?
不负相思意

TA贡献1777条经验 获得超10个赞

你可以尝试类似的东西


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 还支持存储库的“存在”方法,甚至不需要加载实体。


查看完整回答
反对 回复 2023-03-02
?
慕桂英3389331

TA贡献2036条经验 获得超8个赞

以下应该工作


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

    .equalsIgnoreCase(computerProducer.getProducerName());


boolean compProdExists = getAllCimputerProducers()

    .map(list -> list.stream()

        .filter(cpPredicate)

        .findFirst()))

    .isPresent();


查看完整回答
反对 回复 2023-03-02
?
杨__羊羊

TA贡献1943条经验 获得超7个赞

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



查看完整回答
反对 回复 2023-03-02
  • 3 回答
  • 0 关注
  • 211 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信