Using Optional#map (or Optional#transform) to map to another Optional
might indicate an error, or at least quite hard-to-reason-about code that may
turn into an error.
For example,
class AccountManager {
/** Retrieves the current user, or absent if not logged in. */
Optional<Account> getUser() {
...
}
/**
* Returns an administrative token for the user, or absent if they do not have
* such privileges.
*/
Optional<Token> getAdminToken() {
}
void doScaryAdminThings() {
if (getUser().map(AccountManager::getAdminToken).isPresent()) {
// do privileged things.
}
}
}
In this case, assuming getAdminToken does not throw, the conditional is
equivalent to getUser().isPresent(), which is not what was intended.
getUser().flatMap(AccountManager::getAdminToken).isPresent() would be correct.
Suppress false positives by adding the suppression annotation @SuppressWarnings("OptionalMapToOptional") to the enclosing element.