Cuando uso la nueva API de secuencias Java8 para encontrar un elemento específico en una colección, escribo código como este:
String theFirstString = myCollection.stream()
.findFirst()
.get();
Aquí IntelliJ advierte que se llama a get () sin verificar primero isPresent ().
Sin embargo, este código:
String theFirstString = myCollection.iterator().next();
... no da ninguna advertencia.
¿Hay alguna diferencia profunda entre las dos técnicas, que hace que el enfoque de transmisión sea más "peligroso" de alguna manera, que es crucial nunca llamar a get () sin llamar primero a isPresent ()? Buscando en Google, encuentro artículos que hablan sobre cómo los programadores son descuidados con Opcional <> y supongo que pueden llamar a get () siempre que sea necesario.
La cosa es que me gusta que me arrojen una excepción lo más cerca posible del lugar donde mi código tiene errores, que en este caso sería donde estoy llamando a get () cuando no se encuentra ningún elemento. No quiero tener que escribir ensayos inútiles como:
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();
... a menos que exista algún peligro en provocar excepciones de get () que desconozco?
Después de leer la respuesta de Karl Bielefeldt y un comentario de Hulk, me di cuenta de que mi código de excepción anterior era un poco torpe, aquí hay algo mejor:
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));
Esto parece más útil y probablemente será natural en muchos lugares. Todavía siento que querré poder elegir un elemento de una lista sin tener que lidiar con todo esto, pero eso podría ser que necesito acostumbrarme a este tipo de construcciones.