Leere Zeichenfolge abrufen, wenn null

73

Ich möchte Zeichenfolgenwerte meiner Felder abrufen (sie können vom Typ einer langen Zeichenfolge oder eines beliebigen Objekts sein).

Wenn ein Feld null ist, sollte es eine leere Zeichenfolge zurückgeben. Ich habe dies mit Guave gemacht.

nullToEmpty(String.valueOf(gearBox))
nullToEmpty(String.valueOf(id))
...

Dies gibt jedoch null zurück, wenn das Getriebe null ist! Keine leere Zeichenfolge, da valueOf methdod die Zeichenfolge "null" zurückgibt, was zu Fehlern führt.

Irgendwelche Ideen?

EDIt: Es gibt 100 Felder, in denen ich nach etwas suche, das einfach zu implementieren ist

Frühling
quelle

Antworten:

175

Sie können verwenden Objects.toString()(Standard in Java 7):

Objects.toString(gearBox, "")

Objects.toString(id, "")

Aus der verlinkten Dokumentation:

public static String toString(Object o, String nullDefault)

Gibt das Ergebnis des Aufrufs toStringdes ersten Arguments zurück, wenn das erste Argument nicht null ist, und gibt ansonsten das zweite Argument zurück.

Parameter:
o - eine Objektzeichenfolge
nullDefault, die zurückgegeben werden soll, wenn das erste Argument lautetnull

Rückgabe:
Das Ergebnis des Aufrufs toStringdes ersten Arguments, wenn dies nicht nullder Fall ist, und des zweiten Arguments, wenn dies nicht der Fall ist.

Siehe auch:
toString(Object)

arshajii
quelle
@Spring Sie sollten ein Upgrade in Betracht ziehen, insbesondere wenn Java 8 bald herauskommt. In jedem Fall werde ich diese Antwort hinterlassen, falls sie für zukünftige Besucher hilfreich sein kann.
Arshajii
2
Downvoter: Bitte hinterlassen Sie einen Kommentar. Ich würde gerne wissen, was mit meiner Antwort falsch ist, und eine Ablehnung allein sagt mir nichts.
Arshajii
Nett. Ich schlage vorObjects.toString(id, "").trim()
Wender
warum es> API 19 benötigt ... es ist eine einfache Überprüfung. Ich denke, ich muss schreiben, dass ich selbst
M. Kazem Akhgary 1.
1
Das Risiko besteht darin, dass Sie den Typ Ihrer Saite verlieren. Es ist derzeit ein String, aber wenn er in Zukunft in einen anderen Typ geändert wird, schützt der Compiler u
ozma
49

Für Java 8 können Sie den optionalen Ansatz verwenden:

Optional.ofNullable(gearBox).orElse("");
Optional.ofNullable(id).orElse("");
Federico Piazza
quelle
1
Wenn id keine Zeichenfolge ist, scheint es, dass der zweite Zeilencode nicht funktionieren kann
Jack Jin
1
Dadurch werden zwei Methodenaufrufe ausgeführt, ein neues Objekt zugewiesen und sofort verworfen. Dies ist keine Verbesserung gegenüber dem Einfachen gearBox == null ? "" : gearBox. Ein einzelner Methodenaufruf wie StringUtils.defaultStringist JIT-freundlicher.
Vroo
@Vroo, wenn Sie den Abwurf nicht wollen, dann orElseGetkann der stattdessen verwendet werden
Federico Piazza
1
@FedericoPiazza Das ist keine Verbesserung. Erstens orElseGetnimmt einen Delegierten so jetzt habe ich drei Methodenaufrufe. Zweitens wird immer noch ein OptionalObjekt erstellt und dann verworfen.
Vroo
26

Wenn es Ihnen nichts ausmacht, Apache Commons zu verwenden, haben sie eine StringUtils.defaultString(String str), die dies tut.

Gibt entweder den übergebenen String zurück oder, wenn der String null ist, einen leeren String ("").

Wenn Sie auch loswerden möchten "null", können Sie tun:

StringUtils.defaultString(str).replaceAll("^null$", "")

oder um den Fall zu ignorieren:

StringUtils.defaultString(str).replaceAll("^(?i)null$", "")
Keppil
quelle
Was ist, wenn der String der String "null" ist? Das ist mein Problem
Frühling
@Spring: Aktualisiert, um auch diesen Fall zu behandeln.
Keppil
StringUtils.defaultStringprüft bereits auf null. So die sich replaceAlländert , ist nur die Zeichenfolge ist , wenn es sich um eine wörtliche ist "null", das , was wurde nicht gefragt. Hier ist die Quelle:public static String defaultString(String str) { return str == null ? "" : str; }
Vroo
Ich glaube, der erste Kommentar betraf die wörtliche Zeichenfolge "null"
Keppil
9

Wenn alternativ, bietet GuavaStrings.nullToEmpty(String) .

Quellcode

String str = null;
str = Strings.nullToEmpty(str);
System.out.println("String length : " + str.length());

Ergebnis

0
Won-Sik Kim
quelle
8

Verwenden Sie eine Inline-Nullprüfung

gearBox == null ? "" : String.valueOf(gearBox);
Samhain
quelle
Zwei Sekunden zu schnell!
Rainbolt
@ Samhain gibt es 100s Felder Ich suche nach etwas leicht zu implementieren
Frühling
6

Da Sie Guave verwenden:

Objects.firstNonNull(gearBox, "").toString();
Renke
quelle
1
Bist du das auf deinem Profilbild? Ist das nicht Jon?
Kai
von Guave 18 müssen Sie verwendenMoreObjects.firstNonNull
Juan Rada