迭代器下一个方法

时间:2012-03-14 17:37:14

标签: java collections

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

为什么来自Iterator的{​​{1}}只是不删除java.util方法并且只有hasNext()方法将光标移动到下一个元素并返回next?< / p>

3 个答案:

答案 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的历史学家,所以这是我的假设。