迭代程序下一个方法



ResultSet接口中有一个返回布尔值的next方法,然后可以通过get方法直接访问当前记录

为什么java.util中的Iterator没有放弃hasNext()方法,而只有next方法,它会将光标移动到下一个元素并返回boolean

因为next()当前返回下一个项目。

Java本可以像.NET一样实现迭代器模式,MoveNext()返回布尔值,然后Current属性返回"当前"值,但它仍然是两个成员。。。

另一种选择是有一个返回值,它封装了"有值吗"one_answers"如果有值,值是什么"这两个想法——实际上是一种Maybe类型。当然,在Java中,这意味着在每次迭代中分配一个新对象,这并不理想。。。

因为您仍然需要另一个函数来检索值,所以不会获得任何结果。

在ResultSet中,next()将转到下一条记录,如果没有,则返回false。然后执行getString()、getInt()或其他操作来检索字段值。所以你写的代码像:

while (rs.next())
{
  name=rs.getString("name"); // or whatever
  ... do something with name ...
}

在Iterator中,hasNext()返回true或false以指示是否存在另一条记录。然后调用next()来检索该值。所以你写的代码像:

while (iter.hasnext())
{
  name=iter.next(); // or whatever
  ... do something with name ...
}

这种模式最终非常相似。不幸的是,实现不一致。也就是说,ResultSet.next不仅告诉你是否在最后,还提前了仓位,而Iterator.hasNext则告诉你是否在结尾,但没有提前仓位。但实际使用情况非常相似。

尝试将Iterator.hasNext和Iterator.next组合成一个函数是行不通的。你怎么知道你什么时候到达终点?你可以说它在结尾处返回null。。。但是如果null是列表中的有效值呢?我想你可以添加一些神奇的值,但你仍然会遇到将神奇的含义与列表中恰好具有该值的条目区分开来的问题。就像您有一个int列表一样,您可以说-1表示列表的末尾,但如果列表中包含值-1呢?

我看到的唯一另一种选择是让next()函数返回一个对象,该对象包括列表结束指示和值(如果适用)。但这将是一个痛苦的使用。你必须写这样的东西:

while (true)
{
  IterableResult ir=iter.next();
  if (ir.end)
  {
    break;
  }
  else
  {
    name=ir.value;
    ... do something with name ... 
  }
}

这似乎没有任何好处。

也许还有另一种方法会更好,但我想不出一种。显然,Iterator界面的创建者也想不出更好的方法了!:-)

ResultSetnext()方法类似于迭代器的hasNext()。CCD_ 16的大多数其他方法都代替了迭代器的单个CCD_ 17方法。

我想问另一个问题:为什么他们没有让ResultSet实现迭代器,或者至少可以用泛型进行迭代?我认为答案是ResultSet出现在java中的Iterator之前。不久之后,许多类似ORM的工具被引入,所以大多数人只是不直接使用JDBC,也不处理ResultSet

但我不是JDK的历史学家,所以这是我的假设。

相关内容

最新更新