是否有可能在Java中做类似于下面代码的事情

int y = x ?? -1;

更多关于??


遗憾的是,没有。你能做的最接近的是:

int y = (x != null) ? x : -1;

当然,如果您觉得有必要,可以将其打包到库方法中(不太可能减少太多长度),但在语法级别上,没有更简洁的方法了。


Guava有一个类似的方法,叫做MoreObjects.firstNonNull(T,T)。

Integer x = ...
int y = MoreObjects.firstNonNull(x, -1);

当你有一些东西时,这更有帮助

int y = firstNonNull(calculateNullableValue(), -1);

因为它可以避免两次调用可能代价高昂的方法,也可以在代码中声明一个局部变量来引用两次。


简单的回答:没有

最好的方法是创建一个静态实用程序方法(这样就可以使用import static语法导入它)

public static <T> T coalesce(T one, T two)
{
    return one != null ? one : two;
}

上面的方法等价于Guava的@ColinD的firstNonNull方法,但它可以更广泛地扩展

public static <T> T coalesce(T... params)
{
    for (T param : params)
        if (param != null)
            return param;
    return null;
}

来自Apache Commons Lang 3的ObjectUtils.firstNonNull(T…)是另一个选项。我更喜欢这个方法,因为与Guava不同,这个方法不会抛出异常。它将简单地返回null;


不,请注意,变通函数并不完全相同,真正的空合并运算符短路,如&&和||,这意味着如果第一个表达式为空,它只会尝试求第二个表达式的值。