Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/371.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为集合优化多个or语句_Java - Fatal编程技术网

Java 为集合优化多个or语句

Java 为集合优化多个or语句,java,Java,优化以下代码的最佳方法是什么 protected void saveUserRoles(Set<String> userRoles) { if (userRoles != null && (userRoles.contains(StaticValues.LUMEN_SELECT_USER_ROLE) || userRoles.contains(StaticValues.EASY_SENSE_USER_ROLE)

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

  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);
        }
    }
这可能有助于提高可读性:

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);
}

您可以将逻辑提取到具有循环和变量参数的方法中,如

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);
    }
}

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

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个条目,那么没有必要尝试想象-如果这成为瓶颈,我会非常惊讶,在这种情况下,考虑到N是多么小,在复杂性方面找到比ON更快的东西不太可能有用。

为什么它需要优化?下面的代码可以放在一个开关中,如果角色可以增加,它将增加| |语句的数量。这就是为什么要寻找optimization@Nargis你是说你在努力吗保持代码的可读性,还是担心性能?这些是非常不同的关切。您希望测试多少个角色,以及您的性能基准在这方面有多重要?将静态值也放在一个集合中,并使用集合交集。