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绝对正确。但用法仍然类似。