私は次のことを知っています:
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"
をempty
String
に置き換えてください。もっと良い方法があると思います。
最も簡潔なソリューションは次のとおりです。
System.out.println("s: " + (s == null ? "" : s));
または、静的ヘルパーメソッドを作成または使用して同じことを行うこともできます。例えば.
System.out.println("s: " + denull(s));
ただし、この質問には、null
を過剰使用/誤用しているアプリケーションの「におい」があります。 null以外の値の意味とは異なる(および区別する必要がある)特定の意味がある場合にのみ、null
を使用または返すことをお勧めします。
例えば:
null
に初期化されたString属性から来ている場合、代わりに""
に明示的に初期化することを検討してください。null
を使用しないでください。null
を返さないでください。明らかに、これらのすべてに対する反例があり、時には何らかの理由でnullを与える既存のAPIを処理する必要があります。ただし、私の経験では、ほとんどの場合、null
...の使用を避けた方が良いでしょう。
したがって、あなたの場合、より良いアプローチは次のとおりです。
String s = ""; /* instead of null */
System.out.println("s: " + s);
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>
に変換できます。String s = null;
System.out.println("s: " + (s != null ? s : ""));
しかし、あなたが求めているのは本当に求めているのは null合体演算子 です。
Apache Commons StringUtils.defaultString(String)
メソッドを使用できます。サードパーティのライブラリを使用していない場合は、ライナーが1つだけの独自のメソッドを作成することもできます。
private static String nullToEmptyString(String str) {
return str == null ? "" : str;
}
それから、sysoutで次のように使用します。
System.out.println("s: " + nullToEmptyString(s));
別のアプローチは、Java 7 :)で追加されたJava.util.Objects.toString()
を使用することです。
String s = null;
System.out.println("s: " + Objects.toString(s, ""));
これは、文字列だけでなく、任意のオブジェクトで機能します。もちろん、空の文字列だけでなく、別のデフォルト値を指定できます。
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 "";
}
}
これを試して
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
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を混同している可能性があります