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

时间:2011-03-07 17:35:14

标签: c# java equivalent

  

可能重复:
  How to get the first non-null value in Java?

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

int y = x ?? -1;

more about ??

5 个答案:

答案 0 :(得分:105)

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

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

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

答案 1 :(得分:47)

Guava有一种类似名为MoreObjects.firstNonNull(T,T)的方法。

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

当您有类似

之类的内容时,这会更有帮助
int y = firstNonNull(calculateNullableValue(), -1);

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

答案 2 :(得分:34)

简短回答:

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

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

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

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

答案 3 :(得分:15)

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

答案 4 :(得分:0)

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

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