210

是否可以在 Java 中执行类似于以下代码的操作

int y = x ?? -1;

更多关于??

4

6 回答 6

163

可悲的是没有。您可以做的最接近的是:

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

当然,如果您觉得有必要,您可以将其封装在库方法中(它不太可能缩短长度),但在语法级别没有更简洁的可用方法。

于 2011-03-07T17:36:55.340 回答
61

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

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

当你有类似的东西时,这会更有帮助

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

因为它可以避免您两次调用可能很昂贵的方法或在代码中声明一个局部变量以引用两次。

于 2011-03-07T17:50:11.447 回答
41

简短的回答:没有

您可以做的最好的事情是创建一个静态实用程序方法(以便可以使用import static语法导入它)

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

以上等价于firstNonNull@ColinD 的 Guava 方法,但可以更一般地扩展

public static <T> T coalesce(T... params)
{
    for (T param : params)
        if (param != null)
            return param;
    return null;
}
于 2015-07-23T12:44:28.273 回答
21

不,请注意解决方法功能并不完全相同,真正的空合并运算符短路,如 && 和 || 做,这意味着如果第一个表达式为空,它只会尝试评估第二个表达式。

于 2015-09-16T18:06:06.390 回答
16

ObjectUtils.firstNonNull(T...),来自 Apache Commons Lang 3 是另一种选择。我更喜欢这个,因为与 Guava 不同,这种方法不会抛出Exception. 它只会返回null

于 2015-08-26T22:45:08.457 回答
0

Java 中的基元永远不能为空,因此该语句在概念上没有意义。但是,包装类(Integer、Character 等)以及任何其他可实例化类都可以为 null。

除此之外,空合并运算符没有任何简写语法。您必须使用扩展表单。

于 2011-03-07T17:38:40.087 回答