I am trying to avoid isPresent
checks in my code below, but the compiler emits an error with the message
"No instance(s) of type variable(s)
U
exist so thatvoid
conforms toU
"
on the call to printAndThrowException
. This is my code:
values.stream()
.filter(value -> getDetails(value).getName.equals("TestVal"))
.findFirst()
.map(value -> printAndThrowException(value))
.orElseThrow(new Exception2("xyz"));
The method in question printAndThrowException has the below signature:
void printAndThrowException(Pojo value)
The above method always throws an exception of type RuntimeException
. The abovementioned code isn't the exact code, just transformed my code to represent the situation.
What's the problem here and how to avoid using isPresent
when calling printAndThrowException
?
Optional.map()
expects a Function<? super T, ? extends U>
as parameter. Since your method returns void
, it cannot be used like this in the lambda.
I see three options here:
Void
/Object
/whatever instead – semantically not ideal but it would work.map(v -> {
throw printAndReturnException();
});
ifPresent()
, and move the orElseThrow()
outside of the call chain:
values.stream()
.filter(value -> getDetails(value).getName.equals("TestVal"))
.findFirst()
.ifPresent(value -> printAndThrowException(value))
throw new Exception2("xyz");