Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 返回可能存在多个结果的单个结果的正确方法_Java - Fatal编程技术网

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

Java 返回可能存在多个结果的单个结果的正确方法,java,Java,在以下代码中,ssNo参数应确保只有一名员工满足查询条件: Employee employee = null; List<Employee> results = (List<Employee>) query.execute(ssNo); if (results.iterator().hasNext()) { for (Employee r : results) { employee = r; } } return employee;

在以下代码中,
ssNo
参数应确保只有一名
员工
满足查询条件:

Employee employee = null;
List<Employee> results = (List<Employee>) query.execute(ssNo);
if (results.iterator().hasNext())
{
    for (Employee r : results)
    {
        employee = r;
    }
}
return employee;

是否有更干净的方法来执行此类检查?

选择最后一名员工不是一个好主意,因为如果您只希望得到一名员工,而得到了几名员工,那么您的应用程序中可能会出现错误或一些数据完整性问题,而这些问题将不会被注意到,因为您只是返回了任意一名员工。我会抛出一个异常

一个干净的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;
//这将返回与搜索条件匹配的员工列表
//典型的标准是姓名、年龄、工资范围等
//它永远不会为空,但可能是一个空列表
列出getEmployeesByCriteria(…标准);
//这将返回最多一名员工,具体取决于您的搜索条件
//通常,您将使用ID作为标准。如果你找不到雇员
//您可以返回null,也可以抛出异常。如果你找到几个
//员工,那么你应该总是抛出一个异常。
Employee getEmployeeByCriteria(…criteria)抛出一些异常;
遵循“代码越少越好”的格言,此代码与您的代码等价,但表达的代码越少,越清晰

List<Employee> results = (List<Employee>) query.execute(ssNo);
return results.isEmpty() ? null : results.get(results.size() - 1);
另一种常见模式是:

if (results.size() > 1) 
    throw new IllegalStateException("Multiple results found, but at most one was expected");

请注意,您可以将代码缩略到“加密”的程度,但只要代码仍然清晰,少代码总比多代码好。

一个小小的简化可以是删除
if
检查,因为如果结果不止一个,循环将得到最后一个结果


如果结果只有一个,则第一个是最后一个,因此不需要进行
If
检查。

我必须同意Lukas Eder的观点。如果使用的是数据库,则应确保ssNo字段是唯一的。如果您只在内存中工作,那么应该使用一个使用ssNo作为键的哈希表,当您尝试在已经使用的键上插入时,这将引发异常


在任何情况下,代码的这一部分都不是(或不应该是)检查数据有效性的地方。

如果查询返回的结果多于预期结果,则应抛出一个异常,说明这是不正确的

但如果你100%确信这是一个很好的方法,那么这看起来更好

  List<Employee> results = (List<Employee>) query.execute(ssNo);

  if(results.size() > 0) {
    return results.get(results.size() - 1);
  }
List results=(List)query.execute(ssNo);
如果(results.size()>0){
返回results.get(results.size()-1);
}

因此
ssNo
参数不能确保只有1名
Employee
满足查询条件,这就是您需要循环的原因。“正确的方法”不是吗处理这种情况的方法取决于要求是什么?+1-听起来像是一种例外情况,数据的完整性受到了损害。@coobird。你可能是对的。但也许这只是一种防御性编程的尝试
if (results.size() > 1) 
    throw new IllegalStateException("Multiple results found, but at most one was expected");
  List<Employee> results = (List<Employee>) query.execute(ssNo);

  if(results.size() > 0) {
    return results.get(results.size() - 1);
  }