有没有办法避免这种重复?

时间:2021-05-04 19:56:07

标签: java

我这里有一个非常简单的方法:

    private String claimAsString(
        JWTClaimsSet claims,
        String claimName,
        String fallbackClaimName)
    {
        Object claim = claims.getClaim(claimName);
        if (claim != null)
        {
            return (String) claim;
        }

        Object fallbackClaim = claims.getClaim(fallbackClaimName);
        if (fallbackClaim != null)
        {
            return (String) fallbackClaim;
        }
        return null;
    }

基本上是从 JWT 声明集中获取声明,如果它不存在,则获取回退值。但看起来代码的 2 块太相似了......只是想知道是否有更好的方法来重新编写它以使其更清晰。

3 个答案:

答案 0 :(得分:4)

如果你是单线的粉丝,你可以做这样的事情:

Object claim = claims.getStringClaim(claimName);
return (String) (claim == null ? claims.getStringClaim(fallbackClaimName) : claim);

但是,您可能需要考虑将 claimAsString 方法更改为具有 Optional 返回类型。那么你可以这样做:

Optional<String> claimAsString(JWTClaimsSet claims, String claimName, String fallbackClaimName) {
    
    return Optional.ofNullable((String) claims.get(claimName))
            .or(() -> Optional.ofNullable((String) claims.get(fallbackClaimName)));
}

答案 1 :(得分:1)

如果您使用的是 Java 8,则可以在一行中完成整个操作(如果您愿意,也可以两行):

return (String) Optional.ofNullable(claims.getClaim(claimName))
    .orElseGet(() -> claims.getClaim(fallbackClaimName));

如果您使用的是较旧的编译器,作为通用技术,您可以遍历两个搜索字符串:

private String claimAsString(
    JWTClaimsSet claims,
    String claimName,
    String fallbackClaimName)
{
    for (String searchedClaim : new String[] {claimName, fallbackClaimName}) {
        Object claim = claims.getClaim(searchedClaim);
        if (claim != null) {
            return (String) claim;
        }
    }
    return null;
}

答案 2 :(得分:1)

不太确定我是否找到了您正在使用的课程的正确文档,但您可以像这样尝试。如果未找到值,getClaimgetStringClaim 将返回 null,因此您不需要在那里进行 null 检查。

private String claimAsString(
    JWTClaimsSet claims,
    String claimName,
    String fallbackClaimName)
{
    String claim = claims.getStringClaim(claimName);
    if (claim != null){
        return claim;
    }
    return claims.getStringClaim(fallbackClaimName);
}