3

我有一个标志,我想传递给一个函数,该函数根据地图中的值返回真或假:

// userList is a List<String> and is stored as the value field in a map
// user is a String
if(flag)
{
    if (userList == null)
        return false;
    else if(userList.size() == 0)
        return true;

    return userList.contains(user);
}
else
{
    if (userList == null)
        return true;
    else if(userList.size() == 0)
        return false;

    return !userList.contains(user);
}

我的问题是:无论如何要整理这段代码,有很多复制(if 和 else 块是相同的,除了它们的返回值彼此相反)。

我不是一个非常有经验的代码,我真的很感激一些指导!

4

6 回答 6

2

使用flag值而不是常量。

if (userList == null)
    return !flag;
else if(userList.size() == 0)
    return flag;

AXOR将用于最后一条语句(留给读者作为练习:-p)

于 2013-08-25T15:44:30.947 回答
2

我们可以将通用处理移到自己的方法中,然后根据flag变量进行如下分支。

public boolean userExists(String user) {
    return userList != null && (userList.size() == 0 || userList.contains(user));
}

...

if(flag) return userExists(user);
else return !userExists(user);

作为旁注,您可能有逻辑错误。我不确定您为什么要return trueuserList.size() == 0.

于 2013-08-25T15:45:06.693 回答
2

这是一种简化整个代码片段的方法,删除外部if/else语句:

if (userList == null)
    return !flag;
else if (userList.isEmpty())
    return flag;
return userList.contains(user) == flag;
于 2013-08-25T15:46:08.140 回答
1
if (userList == null)
    return !flag;
else if(userList.size() == 0)
    return flag;

return flag ? userList.contains(user) : !userList.contains(user);·
于 2013-08-25T15:45:20.540 回答
0

您可以通过使返回值成为 flag 的函数来轻松删除重复项:

if (userList == null) {
    return !flag;
} else if (userList.size() == 0) {
    return flag;
}

return !flag ^ userList.contains(user);
于 2013-08-25T15:44:39.947 回答
0
return userList != null && userList.contains(user) == flag;

或许能胜任。

于 2013-08-25T15:46:05.390 回答