Gibt es eine Möglichkeit, die Nullprüfung zu vermeiden, bevor die Iteration der for-each-Schleife beginnt? [duplicate]

Lesezeit: 5 Minuten

Benutzer-Avatar
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

Benutzer-Avatar
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

Benutzer-Avatar
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.

    – Edwin Buck

    29. August 2020 um 23:19 Uhr

Es ist bereits 2017, und Sie können jetzt verwenden Apache Commons-Sammlungen4

Die Verwendung:

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


Benutzer-Avatar
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.

    – Charlie Reitzel

    31. Januar 2020 um 19:43 Uhr

Benutzer-Avatar
Gemeinschaft

Nullprüfung in einer erweiterten for-Schleife

public static <T> Iterable<T> emptyIfNull(Iterable<T> iterable) {
    return iterable == null ? Collections.<T>emptyList() : iterable;
}

Dann benutze:

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()) {

}

1333170cookie-checkGibt es eine Möglichkeit, die Nullprüfung zu vermeiden, bevor die Iteration der for-each-Schleife beginnt? [duplicate]

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy