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