在ResultSet
接口中有next
方法返回布尔值,然后您可以通过get
方法直接访问当前记录
为什么来自Iterator
的{{1}}只是不删除java.util
方法并且只有hasNext()
方法将光标移动到下一个元素并返回next
?< / p>
答案 0 :(得分:8)
因为next()
当前返回下一个项目。
Java 可以以与.NET相同的方式实现迭代器模式,MoveNext()
返回一个布尔值,然后Current
属性使用“目前的“价值 - 但它仍然是两个成员......
另一个选择是有一个返回值,它封装了“有一个值”和“如果有一个有什么价值”的两个想法 - 真的是一种Maybe
类型。当然在Java中,这意味着在每次迭代时分配一个新对象,这是不理想的......
答案 1 :(得分:2)
因为你仍然需要另一个函数来检索值,所以什么都得不到。
在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不仅告诉你你是否在最后,而且还推进了positoin,而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 ...
}
}
这似乎没有任何收获。
也许有另一种方法可以更好地运作,但我想不出一个。显然,Iterator接口的创建者也无法想到更好的方法! : - )
答案 2 :(得分:0)
next()
的{{1}}方法与迭代器的ResultSet
类似。 hasNext()
的大多数其他方法不是Iterator的单ResultSet
方法。
我会问其他问题:为什么他们没有使next()
实现迭代器或者至少可以使用泛型进行迭代?我认为答案是{I}在Iterator之前出现ResultSet
。不久之后,引入了许多类似ORM的工具,因此大多数人只是不直接使用JDBC而不处理ResultSet
。
但我不是JDK的历史学家,所以这是我的假设。