【问题标题】:If not null - java 8 style如果不是 null - java 8 风格
【发布时间】:2015-08-31 18:16:55
【问题描述】:

Java 8 提供 Optional 类。

之前(Java 7):

Order order = orderBean.getOrder(id);
if (order != null) {
    order.setStatus(true);
    pm.persist(order);
} else {
    logger.warning("Order is null");
}

Java 8 风格:

Optional<Order> optional = Optional.ofNullable(orderBean.getOrder(id));
optional.ifPresent( s -> {
    s.setStatus(true);
    pm.persist(s);
    //Can we return from method in this place (not from lambda) ???
});
//So if return take place above, we can avoid if (!optional.isPresent) check
if (!optional.isPresent) {
    logger.warning("Order is null");
} 

在这种情况下使用Optional 是否正确?任何人都可以提出一种更方便的 Java 8 风格方式吗?

【问题讨论】:

  • 这种方法效率低,但更简洁,您可以在try块中获取Optional中的元素并捕获NoSuchElementException异常。

标签: java lambda java-8 optional


【解决方案1】:

不幸的是,您正在寻找的 ifPresentOrElse 方法 will be added 仅在 JDK-9 中。目前您可以在项目中编写自己的静态方法:

public static <T> void ifPresentOrElse(Optional<T> optional,
        Consumer<? super T> action, Runnable emptyAction) {
    if (optional.isPresent()) {
        action.accept(optional.get());
    } else {
        emptyAction.run();
    }
}

并像这样使用:

Optional<Order> optional = Optional.ofNullable(orderBean.getOrder(id));
ifPresentOrElse(optional, s -> {
    s.setStatus(true);
    pm.persist(s);
}, () -> logger.warning("Order is null"));

在 Java-9 中会更容易:

optional.ifPresentOrElse(s -> {
    s.setStatus(true);
    pm.persist(s);
}, () -> logger.warning("Order is null"));

【讨论】:

  • 只有当 OP 必须使用处理逻辑参数化函数时,这才会成为一种改进。事实上,他的代码与普通的 if-else 完美匹配。
  • @MarkoTopolnik,我不是说我喜欢这个解决方案。实际上我不喜欢 Optionals 并且很少使用它们。在这段代码中,我肯定会避免使用它们。
  • 好答案。 Optional class= 简单的东西以复杂的方式编写。我真的认为根本没有理由使用这个类,你需要更多的字母来以这种“现代”的方式编写你的代码......
  • @vojta 让我们公平对待 Optional,当您通过一些转换代码有一个“快乐的一天”路径并希望单独处理空值的干扰时,它是一个很好的工具。它确实确实改进了那里的代码。
  • @vojta,在极少数情况下(例如,在流终端操作中),可选功能非常有用,但它不是日常使用的功能。
【解决方案2】:

//Can we return from method in this plase (not from lambda) ???

Lambda 没有实现“非本地返回”语义,因此答案是否定的。

通常,由于在值存在和不存在的情况下都需要采取副作用操作,因此代码中的分支点是必不可少的——无论您是否将其包装在一些花哨的 API 中。此外,FP 通常有助于改进引用透明转换(即围绕纯函数构建的代码)而不是副作用,因此通过 Optional API 不会发现太多好处。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-09
    • 2015-11-02
    • 1970-01-01
    相关资源
    最近更新 更多