在C#中有一个Java等效于空合并运算符(??)吗?

is there a Java equivalent to null coalescing operator (??) in C#?

本问题已经有最佳答案,请猛点这里访问。

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

1
int y = x ?? -1;

更多关于??


可悲的是没有。你最接近的是:

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

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


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

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

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

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

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


简答:不

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

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

上面的内容相当于@ColinD的Guava的方法firstNonNull,但这可以扩展得更多

1
2
3
4
5
6
7
public static < T > T coalesce(T... params)
{
    for (T param : params)
        if (param != null)
            return param;
    return null;
}


不,并且请注意,变通方法功能并不完全相同,真正的空合并运算符短路如&&和|| do,这意味着如果第一个表达式为null,它将只尝试计算第二个表达式。


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


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

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