在Java(或一般)中,迭代器应该是可重用的还是设计用于一次性使用?

时间:2017-07-15 17:00:21

标签: java iterator

我知道无论何时执行foreach循环,都会创建,使用新的迭代器,然后再也不会使用它。

我的问题是关于为自定义类实现迭代器。按照惯例,应该是使用代码

创建的迭代器
Iterator<E> it = new myClass.iterator();

能够被重用 - 也就是说,我的自定义迭代器类是否支持由于某种原因多次遍历元素,或者是实现Iterable类的API的用户知道创建新的迭代器的约定他/她想再次迭代元素?

我希望我的问题不要太模糊;我试图在不违反我所采用的类的代码共享规则的情况下尽可能具体。我最感兴趣的是学习迭代器的常规使用。我也认为在大多数情况下,用户只需要一次性使用迭代器,但希望能够更深入地了解可重用迭代器的使用位置,需求或要求。谢谢!

3 个答案:

答案 0 :(得分:1)

由于Iterator接口仅在一个方向上移动(它支持User.findOne( { 'local.username': req.user.username }, // { $push: { 'jobs':{'website': req.body.joblink } } }, // { returnNewDocument: true }, function(err, user) { // if there are any errors, return the error if (err) { console.log(err); return done(err); } else { user.jobs = []; user.jobs.push( {'website': req.body.joblink} ); console.log(user.jobs); user.save(function(err) { if (err) { console.log(err); throw err; } console.log('user updated: ', user); res.redirect('/profile'); }); } }); 但不支持next()),因此它不可重复使用。

欲了解更多信息: https://docs.oracle.com/javase/8/docs/api/java/util/Iterator.html

答案 1 :(得分:1)

正如其他人所指出的,没有办法将迭代器重置为集合的开头,因此它不可重用。

这不仅适用于java,也适用于C#。

您可能认为可以创建迭代器一次作为集合类的成员,并且每次请求新的迭代器时,您都可以重置它并返回它。

这也不会起作用,因为集合类的调用者可能会在另一个迭代中嵌套迭代,因此嵌套迭代会干扰外部迭代。

答案 2 :(得分:0)

迭代器不可重复使用;每次想要迭代元素时,你需要从Iterable集合中获得一个新的Iterator。

更多你可以参考下面的stackoverflo回答链接:由gustafc回答:

https://stackoverflow.com/a/2599114/7801800