webentwicklung-frage-antwort-db.com.de

Was ist der richtige Ansatz zum Verketten eines Null-Strings in Java?

Ich weiß, dass die folgenden:

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

wird ausgeben: s: null.

Wie bringe ich es dazu, nur s: ​ auszugeben ?

In meinem Fall ist dies wichtig, da ich String aus 4 Werten, s1, s2, s3, s4, wobei jeder dieser Werte darf oder darf) verketten muss nicht haben null Wert.

Ich stelle diese Frage da ich nicht für jede Kombination von s1 bis s4 prüfen möchte (das heißt, überprüfen Sie, ob diese Variablen null sind oder "null" am Ende durch emptyString ersetzen, da ich denke, dass es einige bessere Möglichkeiten gibt, dies zu tun.

33
syntagma

Die prägnanteste Lösung ist:

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

oder erstellen oder verwenden Sie eine statische Hilfsmethode, um dasselbe zu tun. z.B.

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

Diese Frage hat jedoch den "Geruch" einer Anwendung, die null überbeansprucht/missbraucht. Es ist besser, null nur dann zu verwenden/zurückzugeben, wenn es eine bestimmte Bedeutung hat, die sich von den Bedeutungen von Nicht-Null-Werten unterscheidet (und unterscheiden muss).

Beispielsweise:

  • Wenn diese Nullen von String-Attributen stammen, die standardmäßig mit null initialisiert wurden, sollten Sie sie stattdessen explizit mit "" Initialisieren.
  • Verwenden Sie null nicht, um leere Arrays oder Sammlungen zu kennzeichnen.
  • Geben Sie null nicht zurück, wenn es besser wäre, eine Ausnahme auszulösen.
  • Erwägen Sie die Verwendung des Null Object Pattern .

Offensichtlich gibt es Gegenbeispiele zu all diesen, und manchmal müssen Sie sich mit einer bereits vorhandenen API auseinandersetzen, die Ihnen Nullen gibt ... aus welchem ​​Grund auch immer. Meiner Erfahrung nach ist es jedoch besser, die meiste Zeit auf die Verwendung von null zu verzichten.

In Ihrem Fall könnte der bessere Ansatz also sein:

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

Sie können Folgendes mit 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());

gibt

abc

Ein paar Dinge zu beachten:

  • Sie können Datenstrukturen (Listen usw.) direkt in einen Stream<String> Umwandeln.
  • Sie können beim Zusammenfügen der Zeichenfolgen auch ein Trennzeichen eingeben.
23
skiwi
String s = null;
System.out.println("s: " + (s != null ? s : ""));

Aber was Sie wirklich verlangen, ist ein Null-Koaleszenz-Operator .

18
David Ehrmann

Sie können die Methode Apache Commons StringUtils.defaultString(String) verwenden, oder Sie können sogar eine eigene Methode schreiben, die nur ein Zeilenumbruch ist, wenn Sie keine Bibliothek eines Drittanbieters verwenden.

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

und benutze es dann in deinem sysout so:

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

Ein anderer Ansatz ist die Verwendung von Java.util.Objects.toString(), das in Java 7:

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

Dies funktioniert für jedes Objekt, nicht nur für Zeichenfolgen. Natürlich können Sie anstelle der leeren Zeichenfolge auch einen anderen Standardwert angeben.

7
Stuart Marks

Sie können Ihre eigene Methode für concatenation deklarieren:

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

Versuche dies

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

Eine Zeichenfolgenvariable (hier s) heißt null, wenn der Variablen keine Objekte zugewiesen sind. Initialisiere also den variale mit einem leeren String, der "" Ist; Dann können Sie Zeichenfolgen verketten.

Wenn Ihre s-Variable null oder nicht null sein kann, verwenden Sie den bedingten Operator, bevor Sie sie weiter verwenden. Dann ist die Variable s nicht mehr null.

Dies ist ein Beispielcode:

    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);

Beispielausgabe:

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

4
user3717646

Man denke an zwei Methoden: Die erste verwendet keine Verkettung, ist aber die sicherste:

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);

Die zweite Verwendungsverkettung erfordert jedoch, dass Ihre tatsächliche Zeichenfolge niemals "null" enthält, sodass sie möglicherweise nur für sehr einfache Fälle verwendet werden kann (auch wenn Ihre Zeichenfolge niemals "null" ist, würde ich sie niemals verwenden):

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

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

ANMERKUNGEN:

-Beide nutzen externe Utility-Methode, da ich gegen viele Bedingungen bin.

-Dies ist nicht getestet und ich könnte C # -Syntax mit Java verwechseln

1
Fabio Marcolini