我刚刚编写了一个代码来缓存内存中的表(简单的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;
}