如果不是null - java 8样式

时间:2015-08-31 08:02:30

标签: java lambda java-8 optional

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风格中提出更方便的方法吗?

2 个答案:

答案 0 :(得分:7)

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

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"));

答案 1 :(得分:1)

  

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

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

通常,由于在值存在和不存在的情况下都需要具有副作用的操作,因此代码中的分支点是必不可少的 - 无论是否将其包装在某些花哨的API中。此外,FP通常有助于改进引用透明转换(即,围绕纯函数构建的代码)而不是副作用,因此通过可选API将无法获得很多好处。