Gibt es eine Möglichkeit, die Nullprüfung zu vermeiden, bevor die Iteration der for-each-Schleife beginnt? [duplicate]
Lesezeit: 5 Minuten
rk2010
Jedes Mal, wenn ich über eine Sammlung iterieren muss, überprüfe ich am Ende auf null, kurz bevor die Iteration der for-each-Schleife beginnt. So was:
if( list1 != null ){
for(Object obj : list1){
}
}
Gibt es einen kürzeren Weg, um das Schreiben des “if”-Blocks zu vermeiden? Hinweis: Ich verwende Java 5 und werde einige Zeit daran festhalten.
Wie SLaks sagte, sollten Ihre Sammlungen nicht null sein, sondern ihre Größe null sein. In diesem Fall gibt die erweiterte for-Schleife keinen Fehler aus.
– asg
20. Mai 2011 um 21:55 Uhr
Sie können den Block des if entfernen und es hätte den gleichen Effekt
– Ratschenfreak
20. Mai 2011 um 22:04 Uhr
@ratchet Ich kann den “if” -Block nicht entfernen. Falls list1 null ist, dann wird es eine NullPointerException geben
– rk2010
20. Mai 2011 um 22:10 Uhr
Ich meinte, dass Sie tippen if(list1 != null)for(Object obj : list1){...} Mit anderen Worten, entfernen Sie die geschweiften Klammern, damit Sie es auf diese Weise in einer Zeile halten können
– Ratschenfreak
20. Mai 2011 um 22:15 Uhr
@ratchet Interessant … aber ich werde die Codeüberprüfung wahrscheinlich nicht bestehen 🙂
– rk2010
20. Mai 2011 um 22:17 Uhr
SLaks
Wenn möglich, sollten Sie Ihren Code so gestalten, dass die Sammlungen dies nicht sind null an erster Stelle.
null Sammlungen sind schlechte Praxis (aus diesem Grund); Sie sollten stattdessen leere Sammlungen verwenden. (z.B, Collections.emptyList())
Alternativ könnten Sie eine Wrapper-Klasse erstellen, die implementiert Iterable und nimmt eine Sammlung und behandelt a null Sammlung.
Dann könntest du schreiben foreach(T obj : new Nullable<T>(list1))
Ich bin nur einer der Entwickler … ein niederrangiger noch dazu 🙂
– rk2010
20. Mai 2011 um 21:56 Uhr
Wenn Sie Generika verwenden, ist es besser, Collections.emptyList() anstelle von Collections.EMPTY_LIST zu verwenden. es ist typsicher.
– Steven Bußgeld
20. Mai 2011 um 22:04 Uhr
@Dataknife Eher so, als würde es nur das Casting für dich erledigen. In beiden Fällen gibt es zur Laufzeit keine generischen Typen, und die Implementierung von emptyList() enthält intern den Cast (auch bei deaktivierter Unterdrückung).
– Edwin Buck
14. Oktober 2013 um 16:14 Uhr
Dies stellte sich für mich als schlechtes Design heraus. Der Ort, an dem ich sie platziert habe, wurde dann von JAX – B verwendet, um Daten zu entpacken. Diese Listen sind unveränderlich und es würde versuchen, sie zu ergänzen. Ich denke, Sie sollten dies auch berücksichtigen stackoverflow.com/questions/5552258/…
– Abs
4. Juni 2015 um 5:42 Uhr
Und eine leere Liste funktioniert hervorragend, wenn Sie die Idee einer Sammlung haben, in der nichts enthalten ist. Das ist subtil anders als keine Sammlung; und der Unterschied kann erheblich sein. Wenn beispielsweise optionale Listen als leere dargestellt werden, müssen Sie wählen, ob Sie sie als Liste oder als nichts behandeln möchten (die Vereinfachung entfernt eine der beiden Optionen). Dies kann in manchen Situationen unerwünscht sein.
– Edwin Buck
4. Dezember 2020 um 15:25 Uhr
Edwin Buck
public <T extends Iterable> T nullGuard(T item) {
if (item == null) {
return Collections.EmptyList;
} else {
return item;
}
}
oder wenn das Speichern von Textzeilen Priorität hat (sollte es nicht sein)
public <T extends Iterable> T nullGuard(T item) {
return (item == null) ? Collections.EmptyList : item;
}
würde dir erlauben zu schreiben
for (Object obj : nullGuard(list)) {
...
}
Natürlich verschiebt dies die Komplexität wirklich nur an eine andere Stelle.
Gute Antwort, sollte aber wahrscheinlich statisch sein.
– ykaganovich
29. April 2013 um 18:41 Uhr
Es wird nicht nur „die Komplexität woanders hin verschoben“. Es kapselt die Komplexität an einer Stelle, sodass Sie diesen Nullprüfungscode nicht immer wieder schreiben müssen. Die Frage war, wie man es kürzer macht. Der Check muss gemacht werden irgendwo. Du bist sehr bescheiden, @edwin-buck
– Ajoy Bhatia
21. April 2020 um 21:37 Uhr
public T nullGuard(T item) { if (item == null) { return Collections.EmptyList; } Artikel zurückgeben; }
– Bestätiger
28. August 2020 um 23:08 Uhr
@corroborator Ja, das spart die “else” -Anweisung durch eine Kurzschlussrückgabe. Es ist ein äquivalenter Codefluss. Ich habe aktualisiert, um eine noch kleinere Lösung zu haben; aber das wirkliche Speichern von Textzeilen sollte gegenüber leicht lesbarem Code zweitrangig sein. Nicht sicher, was der Stil an der Stelle ist, an der diese Lösung verwendet werden könnte; ahmen Sie jedoch seinen Stil nach (keinen persönlichen), wenn ein dominanter Stil existiert.
for(Object obj : CollectionUtils.emptyIfNull(list1)){
// Do your stuff
}
Dies ist die sauberste Antwort, die ich hier gesehen habe. Gibt es eine Möglichkeit, dasselbe zu tun, wenn meine Liste1 ein Objekt-Array ist, dh Objekt[]?
– der Programmierer
12. Mai 2020 um 20:53 Uhr
for(Object obj : ArrayUtils.nullToEmpty(list1)) { // Do your stuff }
– Fred Pym
16. November 2020 um 9:15 Uhr
rk2010
Ich denke, die richtige Antwort lautet: Es gibt keine Möglichkeit, es kürzer zu machen. Es gibt einige Techniken wie die in den Kommentaren, aber ich sehe mich nicht darin, sie anzuwenden. Ich denke, es ist besser, einen “if”-Block zu schreiben, als diese Techniken zu verwenden. und ja.. bevor es noch mal jemand erwähnt 🙂 “idealerweise” sollte der Code so gestaltet sein, dass die Liste niemals eine sein sollte Null
In Java 8 gibt es eine andere Lösung, die durch using verfügbar ist java.util.Optional und die ifPresent-Methode.
Optional.ofNullable(list1).ifPresent(l -> l.forEach(item -> {/* do stuff */}));
Also keine Lösung für das genaue Problem, aber es ist ein Einzeiler und möglicherweise eleganter.
Java 8 Optional ist ein Fall, in dem die Heilung etwas schlimmer ist als die Krankheit. Optional ist ein ausführlicher und klobiger Ersatz für eine einfache Nullprüfung. Zu vermeiden, imo.
for (Object object : emptyIfNull(someList)) { ... }
Java 8 Optional ist ein Fall, in dem die Heilung etwas schlimmer ist als die Krankheit. Optional ist ein ausführlicher und klobiger Ersatz für eine einfache Nullprüfung. Zu vermeiden, imo.
– Charlie Reitzel
31. Januar 2020 um 19:43 Uhr
Apache Commons
for (String code: ListUtils.emptyIfNull(codes)) {
}
Google Guave
for (String code: Optional.of(codes).get()) {
}
13331700cookie-checkGibt es eine Möglichkeit, die Nullprüfung zu vermeiden, bevor die Iteration der for-each-Schleife beginnt? [duplicate]yes
Wie SLaks sagte, sollten Ihre Sammlungen nicht null sein, sondern ihre Größe null sein. In diesem Fall gibt die erweiterte for-Schleife keinen Fehler aus.
– asg
20. Mai 2011 um 21:55 Uhr
Sie können den Block des if entfernen und es hätte den gleichen Effekt
– Ratschenfreak
20. Mai 2011 um 22:04 Uhr
@ratchet Ich kann den “if” -Block nicht entfernen. Falls list1 null ist, dann wird es eine NullPointerException geben
– rk2010
20. Mai 2011 um 22:10 Uhr
Ich meinte, dass Sie tippen
if(list1 != null)for(Object obj : list1){...}
Mit anderen Worten, entfernen Sie die geschweiften Klammern, damit Sie es auf diese Weise in einer Zeile halten können– Ratschenfreak
20. Mai 2011 um 22:15 Uhr
@ratchet Interessant … aber ich werde die Codeüberprüfung wahrscheinlich nicht bestehen 🙂
– rk2010
20. Mai 2011 um 22:17 Uhr