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

时间:2017-01-13 09:46:05

标签: java

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

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

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

5 个答案:

答案 0 :(得分:38)

一些形式:

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

完全避免空引用更有味道,因此不需要这种检查 - 例如使用Null Object pattern

答案 1 :(得分:10)

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

答案 2 :(得分:6)

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

您可以使用o -> o.getTime()

之类的方法引用代替ClassOfObject::getTime

答案 3 :(得分:5)

String resultString = "1-1+0.4/2+0.5*4";
String[] result = resultString.split("(?<=[^\\d.])(?=\\d)|(?<=\\d)(?=[^\\d.])");
String op = null;
double res = 0;

for (String s : result) {
    if (s.equals("+") || s.equals("-") || s.equals("*") || s.equals("/") ) {
        op = s;
    }
    else {
        if (op == null) {
            res = Double.parseDouble(s);
        } else {
            if (op.equals("+")) {
                res = res + Double.parseDouble(s);
            } else if (op.equals("-")) {
                res = res - Double.parseDouble(s);
            } else if (op.equals("*")) {
                 res *= Double.parseDouble(s);
            } else if (op.equals("/")) {
                res /= Double.parseDouble(s);
            }
        }
    }
}
System.out.println(res); // => 2.8 (= 1-1+0.4/2+0.5*4)

答案 4 :(得分:3)

您可以使用java 8

执行以下操作
long lastPollTime=Optional.ofNullable(object).isPresent()?object.getTime():0;

或不使用像这样的java8

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