gpt4 book ai didi

c# - 简化在 Java 中编写自定义迭代器

转载 作者:搜寻专家 更新时间:2023-11-01 01:47:08 26 4
gpt4 key购买 nike

在 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 return 的东西吗?或者,在用 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 中编写自定义迭代器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6446505/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com