Java Optional 如果对象不为 null - 返回方法结果,如果为 null - 返回默认值

新手上路,请多包涵

是否可以将此代码转换为 Java 8 Optional 单行表达式?

 long lastPollTime;
if (object != null) {
    lastPollTime = object.getTime();
} else {
    lastPollTime = 0;
}

即如果某个对象不为空,我需要调用对象方法并返回其结果,否则返回 0 Optional.ofNullable().orElse() 不合适,因为它返回相同类型的对象,但我需要方法调用的结果或一些默认值。

原文由 mv200580 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 888
2 个回答

几种形式:

 long lastPollTime = Optional.ofNullable(object).map(o -> o.getTime()).orElse(0L);

long lastPollTime = Optional.ofNullable(object).map(YouObjectClass::getTime).orElse(0L);

long lastPollTime = Optional.ofNullable(object).isPresent() ? object.getTime() : 0;

long lastPollTime = object != null ? object.getTime() : 0;

其中,最后一个不使用 Optional(因此没有严格回答您的问题!)更易于阅读并且运行时开销更少,因此应该是首选。

可以说,如果您反转选项,它会更简单:

 long lastPollTime = object == null ? 0 : object.getTime();

…虽然您可能更喜欢将默认设置放在最后 - 这是个人品味的问题。


如果你真的不能使用三元运算符,而且你经常这样做,你可以编写自己的实用方法:

 public <T,U> U mapWithFallback(T obj, Function<T,U> function, U fallback) {
    if(obj == null) {
        return fallback;
    } else {
        return function.apply(obj);
    }
}

…可调用为:

 long lastPollTime = mapWithFallback(object, o -> o.getTime(), 0);


…或使用以下方法完全嘲笑您的非三元检查:

 public <T,U> U ifElse( Supplier<Boolean> a, Supplier<U> ifTrue, Supplier<U> ifFalse) {
     if(a.get()) {
          return ifTrue.get();
     } else {
          return ifFalse.get();
     }
}

long lastPollTime = ifElse( () -> object == null, () -> object.getTime(), () -> 0);


完全避免空引用更好,这样就不需要这种检查——例如使用 空对象模式

…或通过编写返回 Optional 而不是潜在的空值的方法。 Optional 是一个很棒的类;用它。只是不要将某些东西转换为 Optional 纯粹这样你就可以立即检查它是否为空。

原文由 slim 发布,翻译遵循 CC BY-SA 4.0 许可协议

long lastPollTime = Optional.ofNullable(object).map(YouObjectClass::getTime).orElse(0L);

原文由 Vlad Bochenin 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题