如何在自定义类的每个循环中使用java?

Geo*_*Geo 47 java foreach class

我认为大多数程序员都使用如下代码:


ArrayList<String> myStringList = getStringList();
for(String str : myStringList)
{
   doSomethingWith(str);
}
Run Code Online (Sandbox Code Playgroud)

如何利用我自己的类的每个循环?我应该实现一个接口吗?

Bri*_*new 52

您可以实现Iterable.

这是一个例子.它不是最好的,因为对象是它自己的迭代器.但是它应该让你知道发生了什么.

  • 同时实现了`Iterator <>`和`Iterable <>`的实现有副作用:http://blog.dreasgrech.com/2010/03/javas-iterators-and-iterables.html("Iterator不应该是Iterable!"部分).被警告. (2认同)

Tom*_*art 11

for循环的简短版本(T代表我的自定义类型):

for (T var : coll) {
    //body of the loop
}
Run Code Online (Sandbox Code Playgroud)

被翻译成:

for (Iterator<T> iter = coll.iterator(); iter.hasNext(); ) {
    T var = iter.next();
    //body of the loop
}
Run Code Online (Sandbox Code Playgroud)

并且我的集合的迭代器可能如下所示:

class MyCollection<T> implements Iterable<T> {

    public int size() { /*... */ }

    public T get(int i) { /*... */ }

    public Iterator<T> iterator() {
        return new MyIterator();
    }

    class MyIterator implements Iterator<T> {

        private int index = 0;

        public boolean hasNext() {
            return index < size();
        }

        public type next() {
            return get(index++);
        }

        public void remove() {
            throw new UnsupportedOperationException("not supported yet");

        }
   }
}
Run Code Online (Sandbox Code Playgroud)


Pie*_*rre 8

您必须实现Iterable 接口,也就是说,您必须实现该方法

class MyClass implements Iterable<YourType>
{
Iterator<YourType> iterator()
  {
  return ...;//an iterator over your data
  }
}
Run Code Online (Sandbox Code Playgroud)