是否可以将此代码转换为java 8可选的单行表达式?
long lastPollTime;
if (object != null) {
lastPollTime = object.getTime();
} else {
lastPollTime = 0;
}
Run Code Online (Sandbox Code Playgroud)
即如果某个对象不为null,我需要调用object方法并返回其结果,否则返回0. Optional.ofNullable().orElse()不合适,因为它返回相同类型的对象,但我需要方法调用的结果或一些默认值.
sli*_*lim 44
一些形式:
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;
Run Code Online (Sandbox Code Playgroud)
其中,最后一个不使用Optional(因此不严格回答你的问题!),阅读起来更简单,运行时开销更少,因此应该首选.
可以说,如果你颠倒选项,它会更简单:
long lastPollTime = object == null ? 0 : object.getTime();
Run Code Online (Sandbox Code Playgroud)
...虽然你可能更喜欢默认的最后一个 - 这是个人品味的问题.
如果你真的不能使用三元运算符,并且你做了很多,你可以编写自己的实用程序方法:
public <T,U> U mapWithFallback(T obj, Function<T,U> function, U fallback) {
if(obj == null) {
return fallback;
} else {
return function.apply(obj);
}
}
Run Code Online (Sandbox Code Playgroud)
......可以调用:
long lastPollTime = mapWithFallback(object, o -> o.getTime(), 0);
Run Code Online (Sandbox Code Playgroud)
...或使用以下方法对您的非三元检查进行完全嘲弄:
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);
Run Code Online (Sandbox Code Playgroud)
它完全避免了空引用,因此不需要这种检查 - 例如使用Null Object模式.
Vla*_*nin 12
long lastPollTime = Optional.ofNullable(object).map(YouObjectClass::getTime).orElse(0L);
Run Code Online (Sandbox Code Playgroud)
long lastPollTime = Optional.ofNullable(object).map(o -> o.getTime()).orElse(0L);
Run Code Online (Sandbox Code Playgroud)
而不是o -> o.getTime()你可以使用像方法参考ClassOfObject::getTime
小智 5
long lastPollTime = object != null ?object.getTime():0;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
31891 次 |
| 最近记录: |