我刚刚编写了一个代码来缓存内存中的表(简单的java hashmap) . 现在我要替换的代码之一是根据条件查找对象 . 它接收多个字段参数,如果这些字段不为空且不为空,则它们将作为hibernate查询条件的一部分添加 .

要取代这个,我想要做的是

  • 对于每个有效的参数(非空且不为空),我将创建一个满足此条件的HashSet .

  • 一旦我为所有有效标准制作了哈希集,我将在所有集合上调用 Set.retainAll(second_set) . 因此,最后,我将只有那个与所有有效标准相交的集合 .

这听起来像是最好的方法还是有更好的方法来实现它?

EDIT

虽然,我的原始帖子仍然有效,我正在寻找答案 . 我最终以下面的方式实现它 . 原因是因为在创建所有集合之后,它是一种繁琐的集合,所以我必须先弄清楚哪个集合是非空的,以便可以调用retainAll . 它导致了很多if-else语句 . 我目前的实现是这样的

private List<MyObj> getCachedObjs(Long criteria1, String criteria2, String criteria3) {
    List<MyObj> results = new ArrayList<>();
    int totalActiveFilters = 0;

    if (criteria1 != null){
        totalActiveFilters++;
    }

    if (!StringUtil.isBlank(criteria2)){
        totalActiveFilters++;
    }

    if (!StringUtil.isBlank(criteria3)){
        totalActiveFilters++;
    }

    for (Map.Entry<Long, MyObj> objEntry : objCache.entrySet()){
        MyObj obj = objEntry.getValue();

        int matchedFilters = 0;

        if (criteria1 != null) {
            if (obj.getCriteria1().equals(criteria1)) {
                matchedFilters++;
            }
        }

        if (!StringUtil.isBlank(criteria2)){
            if (obj.getCriteria2().equals(criteria2)){
                matchedFilters++;
            }
        }

        if (!StringUtil.isBlank(criteria3)){
            if (game.getCriteria3().equals(criteria3)){
                matchedFilters++;
            }
        }

        if (matchedFilters == totalActiveFilters){
            results.add(obj);
        }
    }
    return results;
}