And*_*yle 115

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

int y = (x != null) ? x : -1;
Run Code Online (Sandbox Code Playgroud)

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

  • 当然,只有当x是一个"整数"时才有效,因为`int`不能与`null`相比较. (29认同)
  • @jmoreno哦,我以为这是一个问题...... (7认同)
  • 那就是`代码块'是什么,所以你可以告诉`int?`是一种数据类型,而不是一个问题.:) (5认同)
  • @musiKk:C#等价物只适用于int?(或者更确切地说是任何引用类型或可空) (2认同)
  • @musiKk:打字?是如何声明可空类型的变量。c# null 合并运算符仅适用于可空类型或引用类型。如果上面的示例是 C#,那么 x 将是 int 类型吗?-- 但最好使用空合并运算符编写为 y=x?? -1; (2认同)

Col*_*inD 49

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

Integer x = ...
int y = MoreObjects.firstNonNull(x, -1);
Run Code Online (Sandbox Code Playgroud)

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

int y = firstNonNull(calculateNullableValue(), -1);
Run Code Online (Sandbox Code Playgroud)

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

  • 像这样的解决方案的真正问题在于它牺牲了空合并延迟评估.由于所有值都必须传递给`Objects.firstNonNull`,因此将评估您传递的所有函数.这使得它的计算成本远远高于C#的`??`. (13认同)
  • 不幸的是,如果所有值都为null,则会抛出NullPointerException.虽然coalesce可以返回null. (8认同)

usr*_*ΛΩΝ 36

简答:

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

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

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

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

  • 请注意,如果两个参数都为空,Guava 的方法会抛出异常! (2认同)

Aka*_*ori 18

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


mat*_*scb 5

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