【问题标题】:Complex if/else logic in java with multiple variables [closed]java中具有多个变量的复杂if/else逻辑[关闭]
【发布时间】:2016-01-06 23:21:03
【问题描述】:

可以有两种类型的组 - 私人和公共。每个组都可以有成员。我有三个参数 id、includePrivate、includePublic 要传递到一个方法中,以根据以下规则返回组。 例如。

public List<Group> getListofGroups(String id, Boolean isPrivate, Boolean   isPublic){}
  1. 所有组{}
  2. 所有私有组 {"includePrivate": true}
  3. 所有公共组 {"includePublic": true}
  4. 所有具有成员资格的私有组 {"id":"id1", "includePrivate": true }
  5. 所有具有成员资格的私有群组 + 所有公共群组 {"id":"id1", "includePrivate": true, "includePublic": true }

实现这种复杂的 if/else 逻辑的最佳方法是什么?只为这个 api 创建一个规则引擎是一个不错的选择吗?

 For eg. if(isPrivate && isPublic && id=!null) {
    return publicAndPrivateWIthMembership();
} else if(isPrivate && id=!null ) {
    return privateGroupsWithMembership();
} else if((isPublic && !isPrivate) ||(isPublic && isPrivate == null) ) {
    return allPublicGroups();
} else if((isPrivate && !isPublic) ||(isPrivate && isPublic == null) ) {
    return allPrivateGroups();
}........

【问题讨论】:

  • 很不清楚你在问什么,但它看起来并不那么复杂。你试过把它写成几个 if/else 语句吗?
  • 我现在为这个问题添加了一些上下文。此外,这些变量中的每一个也可以为空,这会带来复杂性。
  • @MegashyamSandeepV 请更新您问题中的代码,使其更具可读性。
  • id=!null 不是有效的 java。我怀疑你的意思是id!=null
  • 是的@AndyTurner。我现在更正了。

标签: java if-statement rule-engine


【解决方案1】:

类似这样的东西,并不是那么复杂,假设 null 意味着 false:

public List list(String id, Boolean includePrivate, Boolean includePublic) {
    boolean inclPrivate = (includePrivate != null && includePrivate);
    boolean inclPublic = (includePublic != null && includePublic);
    List result = new ArrayList();
    if (inclPublic || ! inclPrivate)
        result.addAll(getAllPublic());
    if (inclPrivate && id != null)
        result.addAll(getPrivateMembers(id));
    else if (inclPrivate || ! inclPublic)
        result.addAll(getAllPrivate());
    return result;
}

当然,如果你实际上是在查询数据库,你可以动态构建WHERE 子句,但既然你不说......

【讨论】:

  • 布尔变量也可以为空。如何计算?
  • @MegashyamSandeepV 您将参数设为Boolean 而不是boolean,并检查它们的值是否在条件中为null
  • @MegashyamSandeepV 已更新以支持空 Boolean 参数。
【解决方案2】:

您可以使用“null 表示不关心”范例。比如:

private List<Group> groups;

public List<Group> getGroups(String id, Boolean includePrivate, Boolean includePublic) {
    return groups.stream()
        .filter(g -> id == null || g.getId().equals(id))
        .filter(g -> includePrivate == null || g.isPrivate() == includePrivate)
        .filter(g -> includePublic== null || g.isPublic() == includePublic)
        .collect(Collectors.toList());
}

以上是AND 的逻辑。如果您想要OR 逻辑,请在一个过滤器中执行:

public List<Group> getGroups(String id, Boolean includePrivate, Boolean includePublic) {
    return groups.stream()
        .filter(g -> (id == null || g.getId().equals(id))) || 
           (includePrivate == null || g.isPrivate() == includePrivate)) ||
           (includePublic== null || g.isPublic() == includePublic)))
        .collect(Collectors.toList());
}

或将谓词推迟到调用者以获得完全灵活的 API:

public List<Group> getGroups(Predicate<Group> predicate) {
     return groups.stream().filter(predicate).collect(Collectors.toList());
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多