我正在尝试查找多个HashMap是否为空。
给出一些背景。我在这里声明了一个哈希图。
static Map<Integer, College> tblColleges = new HashMap<Integer, College>();
对于每个大学对象:
Map<Integer, Department> tblDepartments = new HashMap<Integer, Department>();
我正在尝试添加专业。专业只能作为Department的一个属性存在。
这就是我现在拥有的。
int numberofColleges = Databases.tblColleges.size();
int emptyColleges = 0;
for(int key: Databases.tblColleges.keySet()) {
if(Databases.getTblColleges(key).tblDepartments.isEmpty()) {
emptyColleges++;
}
}
if(numberofColleges == emptyColleges) {
System.out.println("Invalid. Requires at least 1 department.");
}
只有在至少一所大学设有一个系的情况下,我才能创建专业。
基本上,对于tblColleges中存在的每个大学对象,我正在检查它的部门哈希图是否为空。如果是空的,那么我会增加空大学的数量。
然后,我将大学对象的数量与找到的空大学对象进行比较,如果相等,则打印错误。
我想知道是否有更好的更有效的方法来执行此操作,也许是通过使用一些我不熟悉的功能而不是使用变量来实现的。
答案 0 :(得分:1)
问:您可以“更有效地”进行检查吗?
A:您可以对其进行一些优化:
boolean nonEmptyColleges = false;
for (int key: Databases.tblColleges.keySet()) {
if (!Databases.getTblColleges(key).tblDepartments.isEmpty()) {
nonEmptyColleges = true;
break;
}
}
上述短路会在找到College
与Department
时出现。在许多情况下,这将是一个重大的进步。
然后,假设Databases.tblColleges
是Map
:
boolean nonEmptyColleges = false;
for (int college: Databases.tblColleges.values()) {
if (!college.tblDepartments.isEmpty()) {
nonEmptyColleges = true;
break;
}
}
Q:可以用更少的代码进行检查吗?
A:使用Java 8流,您可以将最后一个写为:
boolean nonEmptyColleges = Databases.tblColleges.values().stream()
.anyMatch(c -> !c.tblDepartments.isEmpty());
(我认为...)
问:但这是正确的方法吗?
A:IMO,不。
似乎您打算在每次添加专业时都进行此检查。没必要
专业只能作为Department的属性存在。
您需要检查的关键是要添加专业的部门是否存在。
此处更大的一点是,任何数据模型都将具有各种数据完整性规则/约束。但这确实意味着您每次更改模型时都需要显式检查所有这些。您只需要检查更改的先决条件(例如该部门存在)和任何可能因更改而失效的约束。
1-“否”情况假设可能还有其他找到Department
的方式。它可能是Department
对象的单独表,或者可能是您正在创建和构建新的Department
且尚未将其添加到其College
中。