优化Set <string>的多个或语句

时间:2016-03-10 06:54:54

标签: java

优化以下代码的最佳方法是什么?

  protected void saveUserRoles(Set<String> userRoles) {
        if (userRoles != null && (userRoles.contains(StaticValues.LUMEN_SELECT_USER_ROLE)
                || userRoles.contains(StaticValues.EASY_SENSE_USER_ROLE)
                || userRoles.contains(StaticValues.TLED_USER_ROLE)||userRoles.contains(StaticValues.IR_APP_USER_ROLE))) {
            preferences.setUserRoles(userRoles);
        }
    }

3 个答案:

答案 0 :(得分:2)

我建议您只保留要测试的值的列表或数组:

private static final List USER_ROLES_TO_SAVE = Arrays.asList(
     StaticValues.LUMEN_SELECT_USER_ROLE,
     StaticValues.EASY_SENSE_USER_ROLE,
     StaticValues.TLED_USER_ROLE,
     StaticValues.IR_APP_USER_ROLE);

protected void saveUserRoles(Set<String> userRoles) {
    if (userRoles == null) {
        return;
    }
    for (String candidate : USER_ROLES_TO_SAVE) {
         if (userRoles.contains(candidate)) {
             preferences.setUserRoles(userRoles);
             return;
         }
    }
}

现在很容易维护和阅读 - 而且就性能而言,如果您只想将列表扩展到大约8个条目,那么试图获得想象力是没有意义的 - 如果这成为瓶颈,我绝对惊讶,并且在复杂性方面找到比O(N)更快的东西,考虑到在这种情况下小N,它不太可能有用。

答案 1 :(得分:1)

您可以使用循环和变量参数(varargs)将逻辑提取到方法,例如

private static boolean containsAny(Set<String> userRoles, String... roles) {
    if (userRoles == null || userRoles.isEmpty()) {
        return false;
    }
    for (String role : roles) {
        if (userRoles.contains(role)) {
            return true;
        }
    }
    return false;
}

然后你可以称之为

protected void saveUserRoles(Set<String> userRoles) {
    if (containsAny(userRoles, StaticValues.LUMEN_SELECT_USER_ROLE,
            StaticValues.EASY_SENSE_USER_ROLE, StaticValues.TLED_USER_ROLE, 
            StaticValues.IR_APP_USER_ROLE))) {
        preferences.setUserRoles(userRoles);
    }
}

答案 2 :(得分:0)

Collections#disjoint()可能有助于提高可读性:

static final Set<String> ROLES_TO_SAVE = new HashSet<String>() {{
   add(StaticValues.LUMEN_SELECT_USER_ROLE);
   add(StaticValues.EASY_SENSE_USER_ROLE);
   // ...
}}    

protected void saveUserRoles(Set<String> userRoles) {
    if (userRoles != null && !Collections.disjoint(ROLES_TO_SAVE, userRoles))
        preferences.setUserRoles(userRoles);
}