web-dev-qa-db-ja.com

Javaでnull文字列を連結する正しいアプローチは何ですか?

私は次のことを知っています:

String s = null;
System.out.println("s: " + s);

出力はs: nullです。

どうすればs: ​だけを出力するのですか?

私の場合、4 values、s1, s2, s3, s4からStringを連結する必要があるため、これは重要です。ここで、これらの値はそれぞれmayまたはnot /null値を持つ

私はこの質問をしているs1からs4のすべての組み合わせをチェックしたくない(つまり、これらの変数がnullであるかどうかをチェックする)最後に"null"emptyStringに置き換えてください。もっと良い方法があると思います。

33
syntagma

最も簡潔なソリューションは次のとおりです。

System.out.println("s: " + (s == null ? "" : s));

または、静的ヘルパーメソッドを作成または使用して同じことを行うこともできます。例えば.

System.out.println("s: " + denull(s));

ただし、この質問には、nullを過剰使用/誤用しているアプリケーションの「におい」があります。 null以外の値の意味とは異なる(および区別する必要がある)特定の意味がある場合にのみ、nullを使用または返すことをお勧めします。

例えば:

  • これらのnullがデフォルトでnullに初期化されたString属性から来ている場合、代わりに""に明示的に初期化することを検討してください。
  • 空の配列またはコレクションを示すためにnullを使用しないでください。
  • 例外をスローした方がよい場合は、nullを返さないでください。
  • Null Object Pattern の使用を検討してください。

明らかに、これらのすべてに対する反例があり、時には何らかの理由でnullを与える既存のAPIを処理する必要があります。ただし、私の経験では、ほとんどの場合、null ...の使用を避けた方が良いでしょう。

したがって、あなたの場合、より良いアプローチは次のとおりです。

String s = "";  /* instead of null */
System.out.println("s: " + s);
41
Stephen C

Java 8で次を使用できます。

String s1 = "a";
String s2 = null;
String s3 = "c";
String s4 = "d";
String concat = Stream.of(s1, s2, s3, s4)
        .filter(s -> s != null)
        .collect(Collectors.joining());

与える

abc

注意すべきいくつかの点:

  • データ構造(リストなど)を直接Stream<String>に変換できます。
  • 文字列を結合するときに区切り文字を指定することもできます。
23
skiwi
String s = null;
System.out.println("s: " + (s != null ? s : ""));

しかし、あなたが求めているのは本当に求めているのは null合体演算子 です。

18
David Ehrmann

Apache Commons StringUtils.defaultString(String) メソッドを使用できます。サードパーティのライブラリを使用していない場合は、ライナーが1つだけの独自のメソッドを作成することもできます。

private static String nullToEmptyString(String str) {
    return str == null ? "" : str;
}

それから、sysoutで次のように使用します。

System.out.println("s: " + nullToEmptyString(s));
9
Rohit Jain

別のアプローチは、Java 7 :)で追加されたJava.util.Objects.toString()を使用することです。

String s = null;
System.out.println("s: " + Objects.toString(s, ""));

これは、文字列だけでなく、任意のオブジェクトで機能します。もちろん、空の文字列だけでなく、別のデフォルト値を指定できます。

7
Stuart Marks

concatenationに対して独自のメソッドを宣言できます:

public static String concat(String... s) 
{//Use varArgs to pass any number of arguments
    if (s!=null) {
       StringBuilder sb = new StringBuilder();
       for(int i=0; i<s.length; i++) {
          sb.append(s[i] == null ? "" : s[i]);
       }
       return sb.toString();
    }
    else {
        return "";
    }
}
7
CoderCroc

これを試して

String s = s == null ? "" : s;
System.out.println("s: " + s);

変数にオブジェクトが割り当てられていない場合、文字列変数(ここでは、s)はnullと呼ばれます。そのため、""である空の文字列で変数を初期化します。その後、文字列を連結できます。

S変数がnullまたはnullでない可能性がある場合は、さらに使用する前に条件演算子を使用します。その後、変数sはさらにnullではありません。

これはサンプルコードです:

    String s1 = "Some Not NULL Text 1 ";
    String s2 = null;
    String s3 = "Some Not NULL Text 2 ";

    s1 = s1 == null ? "" : s1;
    s2 = s2 == null ? "" : s2;
    s3 = s3 == null ? "" : s3;

    System.out.println("s: " + s1 + s2 + s3);

サンプル出力:

s: Some Not NULL Text 1 Some Not NULL Text 2

4
user3717646

2つの方法が思い浮かびます。最初の方法は連結を使用しないが、最も安全です。

public static void substituteNullAndPrint(String format, String nullString, Object... params){
    String[] stringParams = new String[params.length()];
    for(int i=0; i<params.length(); i++){
        if(params[i] == null){
            stringParams[i] = nullString;
        }else{
            stringParams[i] = params[i].toSTring();
        }
    }

    String formattedString = String.format(format, stringParams);
    System.out.println(formattedString);
}

USAGE:
substituteNullAndPrint("s: %s,%s", "", s1, s2);

2番目は連結を使用しますが、実際の文字列に「null」が含まれないようにする必要があるため、非常に単純な場合にのみ使用可能です(とにかく文字列が「null」にならない場合でも使用しません):

public static void substituteNullAndPrint(String str){
    str.replace("null", "");
    System.out.println(str);
}

USAGE:
substituteNullAndPrint("s: " + s1);

ノート:

-私は多くの条件をインライン化することに反対しているので、両方とも外部ユーティリティメソッドを利用します。

-これはテストされておらず、C#構文とJavaを混同している可能性があります

1
Fabio Marcolini