Java如果object不为null,则为可选 – 返回方法结果,如果为null,则返回默认值

是否可以将此代码转换为java 8可选的单行表达式?

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

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

一些forms:

 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  U mapWithFallback(T obj, Function function, U fallback) { if(obj == null) { return fallback; } else { return function.apply(obj); } } 

……可以骂人:

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

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

 public  U ifElse( Supplier a, Supplier ifTrue, Supplier ifFalse) { if(a.get()) { return ifTrue.get(); } else { return ifFalse.get(); } } long lastPollTime = ifElse( () -> object == null, () -> object.getTime(), () -> 0); 

它完全避免了空引用,因此不需要这种检查 – 例如使用Null Object模式 。

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

而不是o -> o.getTime()您可以使用类似ClassOfObject::getTime的方法引用

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

你可以用java 8做到这一点

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

或者不使用像这样的java8

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