Avoid NoSuchElementException with Stream
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;
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 returntrue
andget()
will return the value.
Otherwise, Optional#get()
throws a NoSuchElementException
.
If a value is present in this
Optional
, returns the value, otherwise throwsNoSuchElementException
.
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;
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 forOptional.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.