相关疑难解决方法(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万
查看次数

为什么Java不允许在迭代器上使用foreach(仅在迭代器上)?

可能重复:
为什么Java的迭代器不是Iterable?

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

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

据我所知,foreach循环是Java 5中添加的语法糖.所以

Iterable<O> iterable;
for(O o : iterable) {
    // Do something
}
Run Code Online (Sandbox Code Playgroud)

将基本上产生相同的字节码

Iterable<O> iterable;
for(Iterator<O> iter = iterable.iterator(); iter.hasNext(); /* NOOP */) {
    O o = iter.next();
    // Do something
}
Run Code Online (Sandbox Code Playgroud)

但是,如果我首先没有迭代,但只有一个迭代器(比如,因为一个类提供了两个不同的迭代器),我不能使用语法sugar foreach循环.显然我仍然可以做普通的旧式迭代.但是,我其实想做:

Iterator<O> iter;
for(O o : iter /* Iterator<O>, not Iterable<O>! */) {
     // Do something
}
Run Code Online (Sandbox Code Playgroud)

当然我可以做假的Iterable:

class Adapter<O> implements Iterable<O> {
    Iterator<O> iter;

    public Adapter(Iterator<O> iter) {
        this.iter = iter;
    }

    @Override
    public Iterator<O> iterator() {
        return iter; …
Run Code Online (Sandbox Code Playgroud)

java syntax iterator iterable language-design

68
推荐指数
4
解决办法
7万
查看次数

在给定迭代器的情况下使用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
查看次数

标签 统计

java ×3

iterable ×2

iterator ×2

foreach ×1

guava ×1

language-design ×1

syntax ×1