只能在调用 isPresent() 之后访问可选值

Optional value should only be accessed after calling isPresent()

如何根据 Sonar lint 规则更改我的代码?

我的代码如下:

public interface TokenParser {
    public Optional<String> getUserName();
}

public class JWTTokenParser implements TokenParser {

    private Optional<Jwt> getJwt() {
        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
        if (!authentication.isAuthenticated() || authentication instanceof AnonymousAuthenticationToken) {
            return Optional.empty();
        }
        return Optional.ofNullable((Jwt) authentication.getPrincipal());
    }

    @Override
    public Optional<String> getUserName() {
        return Optional.ofNullable(getJwt().get().getClaimAsString("preferred_username"));
    }
}

我无法通过 Sonar 规则。如何更改我的代码?

问题是有关 get 的警告是在未检查 isPresent 的情况下调用的。如果没有值,这将抛出 NoSuchElementException,这违反了使用 Optional.

的想法
    @Override
    public Optional<String> getUserName() {
        return Optional.ofNullable(getJwt().get().getClaimAsString("preferred_username"));
    }

由于 getUserName() 也返回一个 Optional,我们可以使用 Optional#mapOptional<Jwt> 转换为 Optional<String>

 return getJwt().map(jwt -> jwt.getClaimAsString("preferred_username")));

map 方法将为我们处理不同的情况,如下所示:

getJwt() jwt.getClaimAsString("preferred_username") return
empty will not call Optioal.empty()
empty will not call Optioal.empty()
not empty return null Optioal.empty()
not empty return non null value Optional with non null value