编程语言
首页 > 编程语言> > c# – 简化用Java编写自定义迭代器

c# – 简化用Java编写自定义迭代器

作者:互联网

Java中为自定义集合编写迭代器非常复杂,因为您不必编写提供一个元素的直接代码,而是必须编写状态机:

public class CustomCollection<T> implements Iterable<T>
{
    private T[] data;
    private int size;

    @Override
    public Iterator<T> iterator()
    {
        return new Iterator<T>()
        {
            private int cursor = 0;

            @Override
            public boolean hasNext()
            {
                return cursor < size;
            }

            @Override
            public T next()
            {
                return data[cursor++];
            }

            @Override
            public void remove()
            {
                throw new UnsupportedOperationException();
            }
        };
    }
    // ...
}

对于比数组列表或链表更复杂的集合,正确获取这些状态机是一项艰巨的任务.事实上,C#设计团队认为编写自定义迭代器足够复杂,可以引入特殊的语言支持(yield return),让编译器构建状态机.

在下一版本的Java中会出现类似于yield的回报吗?或者是否有任何库解决方案使我在Java中编写自己的迭代器时生活更轻松?

解决方法:

不,Java没有像yield这样的东西.就库而言,Guava有许多有用的类可以使某些类型的迭代器易于编写:

> AbstractIterator只需要您实现T computeNext()方法.
> AbstractLinkedIterator要求您实现T computeNext(T previous).

AbstractIterator可用于此,如下所示:

return new AbstractIterator<T>() {
  private int index = 0;

  protected T computeNext() {
    return index == size ? endOfData() : data[index++];
  }
};

您也可以像Amir建议的那样使用Arrays.asList,甚至可以这样做:

private final List<T> listView = new AbstractList<T>() {
  public int size() {
    return data.length;
  }

  public T get(int index) {
    return data[index];
  }
};

public Iterator<T> iterator() {
  return listView.iterator();
}

标签:c,java,iterator,collections,yield-return
来源: https://codeday.me/bug/20190610/1210489.html