我知道无论何时执行foreach循环,都会创建,使用新的迭代器,然后再也不会使用它。
我的问题是关于为自定义类实现迭代器。按照惯例,应该是使用代码
创建的迭代器Iterator<E> it = new myClass.iterator();
能够被重用 - 也就是说,我的自定义迭代器类是否支持由于某种原因多次遍历元素,或者是实现Iterable类的API的用户知道创建新的迭代器的约定他/她想再次迭代元素?
我希望我的问题不要太模糊;我试图在不违反我所采用的类的代码共享规则的情况下尽可能具体。我最感兴趣的是学习迭代器的常规使用。我也认为在大多数情况下,用户只需要一次性使用迭代器,但希望能够更深入地了解可重用迭代器的使用位置,需求或要求。谢谢!
答案 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回答: