Java 迭代器下一个方法

Java 迭代器下一个方法,java,collections,Java,Collections,在ResultSet界面中有next方法返回布尔值,然后您可以通过get方法直接访问当前记录 为什么迭代器来自java.util只是不删除hasNext()方法,而只有next方法将光标移动到下一个元素并返回boolean?,因为next()当前返回下一项 Java可以用与.NET相同的方式实现迭代器模式,使用MoveNext()返回一个布尔值,然后使用带有“Current”值的Current属性-但它仍然是两个成员 另一种选择是有一个返回值,它封装了“有值吗”和“有值时值是什么”这两个概念,这

ResultSet
界面中有
next
方法返回布尔值,然后您可以通过
get
方法直接访问当前记录

为什么
迭代器
来自
java.util
只是不删除
hasNext()
方法,而只有
next
方法将光标移动到下一个元素并返回
boolean

,因为
next()
当前返回下一项

Java可以用与.NET相同的方式实现迭代器模式,使用
MoveNext()
返回一个布尔值,然后使用带有“Current”值的
Current
属性-但它仍然是两个成员

另一种选择是有一个返回值,它封装了“有值吗”和“有值时值是什么”这两个概念,这实际上是一种
类型。当然,在Java中,这意味着在每次迭代中分配一个新对象,这并不理想。
ResultSet的
next()
方法类似于迭代器的
hasNext()
ResultSet
的大多数其他方法都不是迭代器的单个
next()
方法

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


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

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

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

while (rs.next())
{
  name=rs.getString("name"); // or whatever
  ... do something with name ...
}
while (iter.hasnext())
{
  name=iter.next(); // or whatever
  ... do something with name ...
}
在迭代器中,hasNext()返回true或false以指示是否存在另一条记录。然后调用next()来检索该值。因此,您编写的代码如下:

while (rs.next())
{
  name=rs.getString("name"); // or whatever
  ... do something with name ...
}
while (iter.hasnext())
{
  name=iter.next(); // or whatever
  ... do something with name ...
}
这种模式最终非常相似。不幸的是,这些实现是不一致的。也就是说,ResultSet.next不仅告诉您是否在末尾,而且还推进位置,而Iterator.hasNext告诉您是否在末尾但不推进位置。但实际使用情况非常相似

尝试将Iterator.hasNext和Iterator.next合并到一个函数中是行不通的。你怎么知道你什么时候到达终点?您可以说它在结尾处返回null。。。但是如果null是列表中的有效值怎么办?我想你可以添加一些神奇的值,但是你仍然有问题,如何区分列表中恰好有这个值的条目的神奇含义。比如,如果你有一个整数列表,你可以说-1意味着列表的结束,但是如果列表包含一个值-1呢

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

while (true)
{
  IterableResult ir=iter.next();
  if (ir.end)
  {
    break;
  }
  else
  {
    name=ir.value;
    ... do something with name ... 
  }
}
这似乎没有什么好处


也许还有另一种方法更有效,但我想不出一种。显然,迭代器接口的创建者也无法想出更好的方法!:-)

此外,Iterable.next在执行ResultSet.next之后返回单个值,您可以执行许多getXXX来检索多个值。我假设ResultSet可以实现为一个迭代器,返回一个“Record”对象,然后从记录中提取字段。我想这会更加一致。的确,ResultSet在Iterator之前是在Java中出现的,但Java从1.0版开始就有了枚举,这是Iterator的前身,如果他们想这样做,可以使用它。@Jay,你关于记录的建议正是我的意思。
ResultSet
的迭代可以产生一个“预期”异常,这不会发生在
迭代器上。好吧,他们本来可以这样做。这会创建一个更多的类来处理,但可以说是增加了一致性。我不确定这两种方式是否有任何大的优势。(耸耸肩)我在((o=itr.next())!=null)时尝试了类似的方法,我得到了NoTouchElementException方法在不同的类中,您将看到通过检查不同的条件来抛出NoSuchELementException。例如,Abstractlist有漂亮的IndexOutOfBoundsException捕获块来抛出NoSuchELementException,而在LinkedBlockingDeque类中,我们有下一个!=null checkWell存在差异。ResultSet不执行类似于first get的操作Record,然后对Record对象执行getXXX。它将光标移动到单个语句中的下一个对象,您可以通过getXXX()方法访问该对象的成员。实际上,通过getXXX方法并不能获得整个Record对象。@Delta绝对正确。但用法仍然类似。