Isn't it too low-level? How well does it capture intent and how readable it is? I do not think I want to transform anything (I just want to have a couple of checks)...

When you're starting with optional<UserId> and end with optional<string> then you practically do a transform, even if you don't call it that.
It's like using standard algorithms instead of raw for loops.