Wenn ich die neue Java8-Streams-API verwende, um ein bestimmtes Element in einer Sammlung zu finden, schreibe ich folgenden Code:
String theFirstString = myCollection.stream()
.findFirst()
.get();
Hier warnt IntelliJ, dass get () aufgerufen wird, ohne vorher isPresent () zu überprüfen.
Dieser Code:
String theFirstString = myCollection.iterator().next();
... gibt keine Warnung aus.
Gibt es einen tiefgreifenden Unterschied zwischen den beiden Techniken, der den Streaming-Ansatz in gewisser Weise "gefährlicher" macht, sodass es entscheidend ist, get () nie aufzurufen, ohne isPresent () zuerst aufzurufen? Beim googeln finde ich Artikel darüber, wie nachlässig Programmierer mit Optional <> sind, und gehe davon aus, dass sie get () aufrufen können, wann immer dies der Fall ist.
Ich möchte, dass eine Ausnahme so nah wie möglich an der Stelle ausgelöst wird, an der mein Code fehlerhaft ist. In diesem Fall würde ich get () aufrufen, wenn kein Element gefunden werden kann. Ich möchte nicht unnötige Aufsätze schreiben müssen wie:
Optional<String> firstStream = myCollection.stream()
.findFirst();
if (!firstStream.isPresent()) {
throw new IllegalStateException("There is no first string even though I totally expected there to be! <sarcasm>This exception is much more useful than NoSuchElementException</sarcasm>");
}
String theFirstString = firstStream.get();
... es sei denn, es besteht die Gefahr, Ausnahmen von get () auszulösen, die mir nicht bekannt sind?
Nachdem ich die Antwort von Karl Bielefeldt und einen Kommentar von Hulk gelesen hatte, stellte ich fest, dass mein Ausnahmecode oben etwas ungeschickt war. Hier ist etwas Besseres:
String errorString = "There is no first string even though I totally expected there to be! <sarcasm>This exception is much more useful than NoSuchElementException</sarcasm>";
String firstString = myCollection.stream()
.findFirst()
.orElseThrow(() -> new IllegalStateException(errorString));
Dies sieht nützlicher aus und wird wahrscheinlich an vielen Stellen natürlich vorkommen. Ich habe immer noch das Gefühl, dass ich in der Lage sein möchte, ein Element aus einer Liste auszuwählen, ohne mich mit all dem befassen zu müssen, aber das könnte nur sein, dass ich mich an diese Art von Konstrukten gewöhnen muss.