相关疑难解决方法(0)

为什么Java的迭代器不是Iterable?

为什么Iterator界面没有扩展Iterable

iterator()方法可以简单地返回this.

它是故意还是只是对Java设计师的监督?

能够使用像这样的迭代器的for-each循环会很方便:

for(Object o : someContainer.listSomeObjects()) {
    ....
}
Run Code Online (Sandbox Code Playgroud)

where listSomeObjects()返回一个迭代器.

java iterator iterable

172
推荐指数
7
解决办法
5万
查看次数

在给定迭代器的情况下使用for-each循环的惯用方法?

当增强的for循环(foreach循环)被添加到Java时,它可以使用数组或目标Iterable.

for ( T item : /*T[] or Iterable<? extends T>*/ ) {
    //use item
}
Run Code Online (Sandbox Code Playgroud)

这对于仅实现一种迭代类型的Collection类非常有用,因此只有一个iterator()方法.

但是我发现自己非常沮丧地想要使用Collection类中的非标准迭代器.例如,我最近试图帮助某人使用a Deque作为LIFO /堆栈,然后按FIFO顺序打印元素.我被迫这样做:

for (Iterator<T> it = myDeque.descendingIterator(); it.hasNext(); ) {
   T item = it.next();
   //use item
}
Run Code Online (Sandbox Code Playgroud)

我失去了for-each循环的优点.这不仅仅是击键.如果我不需要,我不喜欢暴露迭代器,因为很容易犯it.next()两次调用等错误.

理想情况下,我认为for-each循环应该也接受了Iterator.但事实并非如此.那么在这些情况下是否存在使用for-each循环的惯用方法?我也很想听到使用像Guava这样的常见集合库的建议.

我能想出的最好的帮助方法/类是:

for ( T item : new Iterable<T>() { public Iterator<T> iterator() { return myDeque.descendingIterator(); } } ) {
    //use item
}
Run Code Online (Sandbox Code Playgroud)

哪个不值得使用.

我很想看到番石榴有类似的东西Iterables.wrap,但没有找到类似的东西.显然,我可以通过类或辅助方法滚动我自己的Iterator包装器.还有其他想法吗?

编辑:作为旁注,任何人都可以给出一个有效的理由,说明为什么增强的for循环不应该只接受一个Iterator?让我使用当前的设计可能会有很长的路要走.

java foreach guava

32
推荐指数
4
解决办法
9749
查看次数

我们可以使用for-each循环来迭代Iterator类型的对象吗?

如果我们执行以下操作,则会收到错误:

class FGH{
public static Iterator reverse(List list) {
     Collections.reverse(list);
     return  list.iterator();
     }
     public static void main(String[] args) {
     List list = new ArrayList();
     list.add("1"); list.add("2"); list.add("3");
     /*for(Iterator it:reverse(list))
     Iterator it=reverse(list);*/
     for (Object obj: reverse(list))
     System.out.print(obj + ", ");}}
Run Code Online (Sandbox Code Playgroud)

但是如果我们像这样修改代码我们就不会得到错误,那么它是否意味着我们不能迭代Iterator类型的对象?:

class FGH{
public static Iterator reverse(List list) {
     Collections.reverse(list);
     return  list.iterator();
     }
     public static void main(String[] args) {
     List list = new ArrayList();
     list.add("1"); list.add("2"); list.add("3");
     Iterator it=reverse(list);
     while(it.hasNext()){
    Object obj=it.next();
    System.out.println(obj);
     }
     }}
Run Code Online (Sandbox Code Playgroud)

java iterator

1
推荐指数
2
解决办法
5166
查看次数

标签 统计

java ×3

iterator ×2

foreach ×1

guava ×1

iterable ×1