web-dev-qa-db-ja.com

C#でnull合体演算子(??)に相当するJavaがありますか?

Javaで次のコードのようなことをすることは可能ですか?

int y = x ?? -1;

??の詳細

150
Nikita Ignatov

悲しいことに-いいえ。最も近い方法は次のとおりです。

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

もちろん、必要に応じてライブラリメソッドでこれをラップできます(長さを大幅に削減することはほとんどありません)が、構文レベルでは、これ以上簡潔なものはありません。

106
Andrzej Doyle

Guava には MoreObjects.firstNonNull(T、T) と呼ばれる同様の処理を行うメソッドがあります。

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

これは次のようなものがある場合に便利です

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

潜在的に高価なメソッドを2回呼び出したり、コード内でローカル変数を宣言して2回参照したりする必要がないためです。

48
ColinD

短い答え:no

できる最善の方法は、静的ユーティリティメソッドを作成することです(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;
}

いいえ、回避策関数はまったく同じではないことに注意してください。&&や||のような真のヌル合体演算子短絡です。つまり、最初の式がnullの場合にのみ2番目の式を評価しようとします。

16
AkariAkaori

ObjectUtils.firstNonNull(T...) 、Apache Commons Lang 3の別のオプションです。 Guavaとは異なり、この方法が好きです。このメソッドはExceptionをスローしません。単にnullを返します。

5
mateuscb

Javaのプリミティブがnullになることはないため、このステートメントは概念的に意味をなしません。ただし、ラッパークラス(整数、文字など)、およびその他のインスタンス化可能なクラスはnullにすることができます。

その事実に加えて、null合体演算子の短縮構文はありません。拡張フォームを使用する必要があります。

0
helloworld922