java - ejemplo - Evita NoSuchElementException con Stream
optional lambda java (3)
Tengo el siguiente Stream
:
Stream<T> stream = stream();
T result = stream.filter(t -> {
double x = getX(t);
double y = getY(t);
return (x == tx && y == ty);
}).findFirst().get();
return result;
Sin embargo, no siempre hay un resultado que me da el siguiente error:
NoSuchElementException: sin valor presente
Entonces, ¿cómo puedo devolver un null
si no hay un valor presente?
Puede usar Optional.orElse
, es mucho más simple que verificar isPresent
:
T result = stream.filter(t -> {
double x = getX(t);
double y = getY(t);
return (x == tx && y == ty);
}).findFirst().orElse(null);
return result;
Un método alternativo para reemplazar el Optional.get
(que es más probable que no falle las intenciones del usuario con una NoSuchElementException) es con una API más detallada introducida en JDK10 denominada Optional.orElseThrow()
. En palabras del autor :
Optional.get()
es una "molestia atractiva" y es demasiado tentador para los programadores, lo que lleva a errores frecuentes. La gente no espera que un getter arroje una excepción. Se debe agregar una API de reemplazo paraOptional.get()
con semántica equivalente.
Nota : - La implementación subyacente de estas dos API es la misma, sin embargo, la última indica con mayor claridad que una excepción NoSuchElementException se lanzaría de forma predeterminada si el valor no está presente, lo cual se aplica a la Optional.orElseThrow​(Supplier<? extends X> exceptionSupplier)
Implementación usada por los consumidores como una alternativa explícita.
Stream#findFirst()
devuelve un Optional
que existe específicamente para que no necesite operar con valores null
.
Un objeto contenedor que puede contener o no un valor no nulo. Si hay un valor presente,
isPresent()
devolverátrue
yget()
devolverá el valor.
De lo contrario, Optional#get()
arroja una NoSuchElementException
.
Si hay un valor presente en este
Optional
, devuelve el valor; de lo contrario, lanzaNoSuchElementException
.
Un Optional
nunca expondrá su valor si es null
.
Si realmente tiene que hacerlo , simplemente marque isPresent()
y devuelva null
usted mismo.
Stream<T> stream = stream();
Optional<T> result = stream.filter(t -> {
double x = getX(t);
double y = getY(t);
return (x == tx && y == ty);
}).findFirst();
if (result.isPresent())
return result.get();
return null;