¿hay un equivalente de Java para el operador coalescente nulo (??) en C #?

Posible duplicado:
¿Cómo obtener el primer valor no nulo en Java?

¿Es posible hacer algo similar al siguiente código en Java?

int y = x ?? -1; 

más sobre ??

Tristemente no. Lo más cerca que puedes hacer es:

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

Por supuesto, puede resumir esto en los métodos de la biblioteca si siente la necesidad (es poco probable que reduzca mucho la longitud), pero a nivel de syntax no hay nada más breve disponible.

La guayaba tiene un método que hace algo similar llamado MoreObjects.firstNonNull (T, T) .

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

Esto es más útil cuando tienes algo como

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

ya que le evita llamar dos veces al método potencialmente costoso o declarar una variable local en su código para hacer referencia dos veces.

Respuesta corta: no

Lo mejor que puede hacer es crear un método de utilidad estático (para que pueda ser importado usando import static syntax import static )

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

Lo anterior es equivalente al método de Guava firstNonNull de @ColinD, pero eso se puede extender más en general

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

No, y tenga en cuenta que las funciones de solución no son exactamente las mismas, un verdadero operador coalescente nulo tiene cortocircuitos como && y || do, lo que significa que solo intentará evaluar la segunda expresión si la primera es nula.

ObjectUtils.firstNonNull(T...) , de Apache Commons Lang 3 es otra opción. Prefiero esto porque a diferencia de Guava, este método no arroja una Exception . Simplemente devolverá null ;

Los primitivos en Java nunca pueden ser nulos, por lo que esa afirmación no tiene sentido conceptualmente. Sin embargo, las clases contenedoras (Integer, Character, etc.), así como cualquier otra clase instanciable pueden ser nulas.

Además de ese hecho, no hay ninguna syntax de mano corta para un operador coalescente nulo. Debe usar la forma expandida.