在以下代码中,ssNo
参数应确保只有一个Employee
满足查询条件:
Employee employee = null;
List<Employee> results = (List<Employee>) query.execute(ssNo);
if (results.iterator().hasNext())
{
for (Employee r : results)
{
employee = r;
}
}
return employee;
但如果有多个结果,for
循环可确保循环中的最后一个Employee
:
for (Employee r : results)
{
employee = r;
}
是否有更简洁的方法来执行此类检查?
答案 0 :(得分:8)
遵循“代码较少”的口号,这段代码与您的代码相同,但代码更少,更清晰。
List<Employee> results = (List<Employee>) query.execute(ssNo);
return results.isEmpty() ? null : results.get(results.size() - 1);
更常见的是看到第一个元素返回:
return results.isEmpty() ? null : results.get(0);
另一种常见模式是:
if (results.size() > 1)
throw new IllegalStateException("Multiple results found, but at most one was expected");
请注意,您可以将代码过度缩写为“加密”,但只要代码仍然清晰,代码总是比代码更多。
答案 1 :(得分:5)
选择最后一名员工并不是一个好主意,因为如果您希望只获得一名员工,而是获得多名员工,那么您的应用程序或某些数据完整性问题可能会出现问题。没有注意到,因为你只是返回任意一个。我会抛出异常。
干净的API看起来像这样:
// This returns a list of employees matching your search criteria
// Typical criteria are names, age, salary ranges, etc
// It will never be null, but maybe an empty list
List<Employee> getEmployeesByCriteria(... criteria);
// This will return at most one employee, depending on your search criteria
// Typically, you'll use an ID as criteria. If you don't find the employee
// you can either return null, or throw an exception. If you find several
// employees, then you should always throw an exception.
Employee getEmployeeByCriteria(... criteria) throws SomeException;
答案 2 :(得分:0)
一个小的简化可能是删除if
检查,因为如果结果多于一个,循环将获得最后的结果。
如果结果只是第一个结果是最后一个结果,那么不需要进行if
检查。
答案 3 :(得分:0)
我必须同意Lukas Eder。如果您正在使用数据库,则应确保ssNo字段是唯一的。如果你只在内存中工作,你应该使用ssNo作为键来使用Hashtable,当你尝试插入已经使用过的键时会抛出异常。
在任何情况下,代码的这一部分都不是检查数据有效性的地方(或不应该这样)。
答案 4 :(得分:0)
如果查询返回更多的预期结果,则应抛出异常,这是不正确的。
但如果您100%确定这对您的情况来说是好方法,那么这看起来更好。
List<Employee> results = (List<Employee>) query.execute(ssNo);
if(results.size() > 0) {
return results.get(results.size() - 1);
}