Je sais que ce qui suit:
String s = null;
System.out.println("s: " + s);
affichera: s: null
.
Comment puis-je le faire sortir simplement s:
?
Dans mon cas, cela est important car je dois concaténer String
à partir de 4 valeurs, s1, s2, s3, s4
, où chacune de ces valeurs peut ou non avoir une valeur de null
.
Je pose cette question car je ne veux pas vérifier toutes les combinaisons de s1 à s4 (c'est-à-dire vérifier si ces variables sont null
) ou remplacez "null"
avec empty
String
à la fin, car je pense qu'il peut y avoir de meilleures façons de le faire.
La solution la plus concise est la suivante:
System.out.println("s: " + (s == null ? "" : s));
ou peut-être créer ou utiliser une méthode d'assistance statique pour faire de même; par exemple.
System.out.println("s: " + denull(s));
Cependant, cette question a "l'odeur" d'une application qui surexploite/abuse de null
. Il est préférable d'utiliser/renvoyer un null
uniquement s'il a une signification spécifique distincte (et doit être distincte) de la signification des valeurs non nulles.
Par exemple:
null
, envisagez de les initialiser explicitement à ""
au lieu.null
pour désigner des tableaux ou des collections vides.null
quand il serait préférable de lever une exception.Maintenant, évidemment, il y a des contre-exemples à tout cela, et parfois vous devez faire face à une API préexistante qui vous donne des valeurs nulles ... pour une raison quelconque. Cependant, d'après mon expérience, il vaut mieux éviter d'utiliser null
... la plupart du temps.
Donc, dans votre cas, la meilleure approche peut être:
String s = ""; /* instead of null */
System.out.println("s: " + s);
Vous pouvez utiliser ce qui suit avec 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());
donne
abc
Quelques points à noter:
Stream<String>
.String s = null;
System.out.println("s: " + (s != null ? s : ""));
Mais ce que vous demandez vraiment est un opérateur de coalescence nul .
Vous pouvez utiliser la méthode Apache Commons StringUtils.defaultString(String)
, ou vous pouvez même écrire votre propre méthode qui ne serait qu'une ligne, si vous n'utilisez aucune bibliothèque tierce.
private static String nullToEmptyString(String str) {
return str == null ? "" : str;
}
puis utilisez-le dans votre sysout comme suit:
System.out.println("s: " + nullToEmptyString(s));
Une autre approche consiste à utiliser Java.util.Objects.toString()
qui a été ajouté dans Java 7:
String s = null;
System.out.println("s: " + Objects.toString(s, ""));
Cela fonctionne pour n'importe quel objet, pas seulement pour les chaînes, et bien sûr, vous pouvez fournir une autre valeur par défaut au lieu de simplement la chaîne vide.
Vous pouvez déclarer votre propre méthode pour 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 "";
}
}
Essaye ça
String s = s == null ? "" : s;
System.out.println("s: " + s);
Une variable chaîne (ici, s
) est appelée null
quand aucun objet n'est affecté à la variable. Initialisez donc la variale avec une chaîne vide qui est ""
; Ensuite, vous pouvez concaténer des chaînes.
Si votre variable s peut être nulle ou non nulle, utilisez l'opérateur conditionnel avant de l'utiliser à nouveau. La variable s
n'est alors plus nulle.
Ceci est un exemple de code:
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);
Exemple de sortie:
s: Some Not NULL Text 1 Some Not NULL Text 2
Deux méthodes me viennent à l'esprit, la première n'utilise pas la concaténation mais est la plus sûre:
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);
La seconde utilise la concaténation mais requiert que votre chaîne réelle ne contienne jamais "null", donc elle ne peut être utilisable que pour des cas très simples (Quoi qu'il en soit, même si votre chaîne n'est jamais "null", je ne l'utiliserais jamais):
public static void substituteNullAndPrint(String str){
str.replace("null", "");
System.out.println(str);
}
USAGE:
substituteNullAndPrint("s: " + s1);
REMARQUES:
-Les deux utilisent une méthode d'utilité externe car je suis contre l'inclusion de beaucoup de conditionnels.
-Ce n'est pas testé et je pourrais confondre la syntaxe c # avec Java