I\'ve read here why Optional.of()
should be used over Optional.ofNullable()
, but the answer didn\'t satisfy me at all, so I ask slightly different:
You are mixing up the API design rationale with knowledge within a particular implementation code. It’s perfectly possible that a method declares to return an Optional
, because the value might be absent, while at a certain code location within the method, it is known to be definitely present. I.e.
String content;
public Optional firstMatch(String pattern) {
Matcher m = Pattern.compile(pattern).matcher(content);
return m.find()? Optional.of(m.group()): Optional.empty();
}
This method’s return type denotes a String
that might be absent, while at the code locations creating an Optional
instance, it is known whether the value is present or absent. It’s not about detecting a null
value here.
Likewise, within the Stream API methods findFirst()
and findAny()
, it will be known at one point, whether there is a matching element, whereas supporting the conversion of its presence to absence in case of a matching null
element is explicitly unsupported and supposed to raise a NullPointerException
, per specification. Therefore, Optional.of
will be used to return the matching element, which you can easily recognize in the stack trace when using Stream.of((Object)null) .findAny();