Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java可选如果对象不为null-返回方法结果,如果为null-返回默认值_Java - Fatal编程技术网

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

Java可选如果对象不为null-返回方法结果,如果为null-返回默认值,java,Java,是否可以将此代码转换为Java8可选的单行表达式 long lastPollTime; if (object != null) { lastPollTime = object.getTime(); } else { lastPollTime = 0; } i、 如果某个对象不是null,我需要调用一个对象方法并返回其结果,否则返回0。 可选。ofNullable().orElse()不合适,因为它返回相同类型的对象,但我需要方法调用的结果或一些默认值。您可以使用java 8执行

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

long lastPollTime;
if (object != null) {
    lastPollTime = object.getTime();
} else {
    lastPollTime = 0;
}
i、 如果某个对象不是null,我需要调用一个对象方法并返回其结果,否则返回0。
可选。ofNullable().orElse()
不合适,因为它返回相同类型的对象,但我需要方法调用的结果或一些默认值。

您可以使用java 8执行以下操作

long lastPollTime=Optional.ofNullable(object).isPresent()?object.getTime():0;
或者不使用像这样的java8

 long lastPollTime = object != null ?object.getTime():0;
您可以使用方法引用,而不是
o->o.getTime()
,例如
ClassOfObject::getTime

一些形式:

long lastPollTime = Optional.ofNullable(object).map(YouObjectClass::getTime).orElse(0L);
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;
其中,最后一个选项不使用可选选项(因此不严格回答您的问题!)更易于阅读,运行时开销更少,因此应该优先选择

可以说,如果您将选项颠倒过来,情况会更简单:

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

。。。或者使用以下方法彻底嘲弄您的非永久性支票:

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);
public U if else(供应商a、供应商ifTrue、供应商ifFalse){
if(a.get()){
返回ifTrue.get();
}否则{
返回ifFalse.get();
}
}
long lastPollTime=ifElse(()->object==null,()->object.getTime(),()->0);

完全避免空引用会更好,因此不需要这种检查——例如使用


。。。或者编写返回
可选
而不是潜在空值的方法<代码>可选是一门很棒的课程;使用它。只是不要纯粹地将某个东西转换为
可选的
,这样你就可以立即检查它是否为空。

套用杰米·扎温斯基的话:“有些人在遇到问题时,会认为‘我知道,我会用’;现在他们有两个问题。”。使用条件运算符以外的任何东西将其转换为一行只是做了不必要的工作。如果必须先构造可选的,我同意Andy的观点,它实际上对您没有任何帮助。但是,如果由于其他原因您有/存储了可选的映射/orElse,则映射/orElse很不错。@mv200580听起来您需要了解三元运算符--@mv200580如果您的checkstyle配置阻止您编写“正确”的代码,您应该更改checkstyle规则,或者在适当的情况下使用注释临时禁用该检查。与掌握控制权的人讨论。是的,这是一个明显的决定,但在这种情况下需要“java可选方式”变体。我在这个表达式中没有看到任何可选的:)我理解这是最短的,可能是最有效的方式,但在我的情况下,这是不可接受的,unfortunately@mv200580我的错,我没弄清楚,但是我的答案可能对其他人有帮助。java 8有一个布尔isPresent()方法,如果存在值,则返回true,否则返回false。
的运行时开销较少,因此应该优先选择
强烈反对。在你确定这是一个问题之前,你不应该费心去做这样的“开销削减”。所以,人们常常出于“性能原因”而避免使用这些结构,因为它们对代码性能几乎没有可测量的影响。然后,当需要维护代码并添加新功能时,您没有方便地使用钩子来添加新功能,而是留下了一大堆三元逻辑。@corsoKa,但您在引用中省略了“更易于阅读”。过早的优化是不好的。但是仅仅为了它而过于华丽的构造也是不好的。注意——Javascript库Ramda和其他FP库有一个
ifElse(谓词、函数、函数)
非常像这里描述的。mapwithFallback()方法非常合理。
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);