Avoid NoSuchElementException with Stream
JavaJava 8Java StreamOptionalJava Problem Overview
I have the following 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;
However, there is not always a result which gives me the following error:
>NoSuchElementException: No value present
So how can I return a null
if there is no value present?
Java Solutions
Solution 1 - Java
You can use Optional.orElse
, it's much simpler than checking isPresent
:
T result = stream.filter(t -> {
double x = getX(t);
double y = getY(t);
return (x == tx && y == ty);
}).findFirst().orElse(null);
return result;
Solution 2 - Java
Stream#findFirst()
returns an Optional
which exists specifically so that you don't need to operate on null
values.
> A container object which may or may not contain a non-null value. If a
> value is present, isPresent()
will return true
and get()
will return
> the value.
Otherwise, Optional#get()
throws a NoSuchElementException
.
> If a value is present in this Optional
, returns the value, otherwise
> throws NoSuchElementException
.
An Optional
will never expose its value if it is null
.
If you really have to, just check isPresent()
and return null
yourself.
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;
Solution 3 - Java
An alternate method for replacing the Optional.get
(which more likely than not fails the user's intentions with a NoSuchElementException) is with a more verbose API introduced in JDK10 termed as Optional.orElseThrow()
. In author's words -
> Optional.get()
is an "attractive nuisance" and is too tempting for
> programmers, leading to frequent errors. People don't expect a getter
> to throw an exception. A replacement API for Optional.get()
with
> equivalent semantics should be added.
Note :- The underlying implementation of both these APIs is same, yet the latter reads out more clearly that a NoSuchElementException would be thrown by default if the value is not present which inlines to the existing Optional.orElseThrow(Supplier<? extends X> exceptionSupplier)
implementation used by consumers as an explicit alternate.
Solution 4 - Java
If you wish to continue using the object and not throw any exception, then
Optional.isPresent(object)
is the way to go