【问题标题】:How to pick the value from ifPresent of Optional如何从 Optional 的 ifPresent 中选择值
【发布时间】:2015-04-22 08:15:36
【问题描述】:

我如何从方法ifPresent 中选择值,因为此方法返回 void?

我要应用的逻辑是:如果对象deliveryInfo不是null,则取交货数量并将其设置到对象dto中,但使用Optional,不做任何空检查。

Optional<TT021DeliveryCodingContainerDto> deliveryInfo =
    tt021OrderingBusinessHandler
        .getDeliveryCodingContainersByDeliveryAndOrderDetail(
            delivery.getId(), position.getOrderDetails().getId());
deliveryInfo.ifPresent(TT021DeliveryCodingContainerDto::getDeliveredQuantity);
dto.setQuantityDelivered(deliveredQuantity);

【问题讨论】:

  • getDeliveryCodingContainersByDeliveryAndOrderDetail。嗯,这是一个方法名。您可以查看orElse()orElseGet()orElseThrow()。或使用if(opt.isPresent()){T val = opt.get(); //do something with val}
  • 什么是deliveredQuantity?你能展示你如何做到这一点没有可选?
  • 如果我这样做 if(opt.isPresent()){T val=opt.get()},我看不出这种方法对使用普通空值检查有什么好处
  • Optional 不会让你的代码更干净,它是一种与旧代码一起使用的技巧。为了让你的代码对新代码更干净,不要在任何地方允许null

标签: java java-8 optional


【解决方案1】:

Optional.ifPresent() 是一个接受消费者的终端方法。 Consumer 是一个函数,它接受一些参数并使用它们并且不返回任何内容。您可以从作为消费者传递的 lambda 表达式中使用的参数中选择值。

Optional<TT021DeliveryCodingContainerDto> deliveryInfo =
tt021OrderingBusinessHandler
    .getDeliveryCodingContainersByDeliveryAndOrderDetail(
        delivery.getId(), position.getOrderDetails().getId());

deliveryInfo.map(info -> info.getDeliveredQuantity())
.ifPresent(quantity -> dto.setQuantityDelivered(quantity); // you can replace those with method references

【讨论】:

  • 为什么叫它终端?它不会结束任何事情。
  • @zeroflagL 它结束了 Optional monad 上的操作管道
  • 什么管道?您可以调用 ifPresent ,然后调用 Optional 的任何其他方法。最终消耗的不是Stream
  • @zeroflagL 因为它与 Stream 的惰性求值无关。在某些时候,您需要从一元上下文中解包一个值并对其进行处理。这就是这个方法的作用。 “管道”是指一元转换链
  • 但是你把它描述成一个流,这就是重点。不:它不会解开价值。遵循您的逻辑Collection.forEach 也将是终端操作。 Java 的Optional 并不是您认为的复杂构造。这只是一种清楚地传达没有结果的方式。
【解决方案2】:

类似deliveryInfo.ifPresent(i -&gt; dto.setQuantityDelivered(i.getDeliveredQuantity());?

如果你想从方法中返回一些东西,使用map而不是ifPresent;这将返回另一个 Optional 包装结果(如果有的话)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-10
    • 2017-03-18
    • 1970-01-01
    • 2019-07-19
    • 2017-08-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多