正确的方法返回可能存在多个结果的单个结果

时间:2011-06-08 12:10:55

标签: java

在以下代码中,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;
}

是否有更简洁的方法来执行此类检查?

5 个答案:

答案 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);
  }