我刚刚编写了一个代码来缓存内存中的表(简单的java hashmap)。现在我要替换的代码之一是根据条件查找对象。它接收多个字段参数,如果这些字段不为空且不为空,则它们将作为hibernate查询条件的一部分添加。
要替换它,我想要做的是
Set.retainAll(second_set)
。所以最后,我将只有那个与所有有效标准相交的集合。 这听起来像是最好的方法还是有更好的方法来实现它?
修改
虽然,我的原帖仍然有效,我正在寻找答案。我最终以下面的方式实现它。原因是因为在创建所有集合之后,它是一种繁琐的集合,所以我必须先弄清楚哪个集合是非空的,以便可以调用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;
}