util ejemplo baeldung java java-8 java-stream optional

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 para Optional.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 y get() 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, lanza NoSuchElementException .

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;