java - 如果不为空 - java 8 风格

标签 java lambda java-8 option-type

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 风格的方法?

最佳答案

不幸的是,您正在寻找的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"));

关于java - 如果不为空 - java 8 风格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32306530/

相关文章:

java - 动态地将方法体重新分配给对象

c# - Linq to entities if else 条件查询

java - Javadocs 8 的 Lokups

java - maven 编译失败并出现错误 -source 1.7 中不支持静态接口(interface)方法

java - 如何在运行时和开发环境中从 jar 中复制文件夹的资源?

java - 多行正则表达式

java - 为什么Maven在寻找 `webapp\WEB-INF\web.xml`而不是 `web-app\WEB-INF\web.xml`

java - 删除 JComboBox 中的突出显示

Java 8 : AveragingDouble and mapping to object

java - 如何根据重复的父对象合并列表中的子对象