我有一个类看起来像下面的代码。它实现了Iterable<T>
iterface,它用于在其包含的数组上提供迭代功能。
我一直习惯于使用我自己的琐碎迭代器迭代数组。然而,我只是意识到,至少对于 spliterators ,您可以通过调用Arrays.spliterator(array)
来获得可接受的默认实现。在Iterator<T>
数组上是否存在普通T
的类似默认实现?
public class MyClass implements Iterable<ContainedClass>
{
...
private final ContainedClass[] array;
...
//
// INTERFACE: Iterable<ContainedClass>
//
@Override
public Iterator<ContainedClass> iterator() {
return ??? // I want to return a default implementation, not my own!
}
@Override
public Spliterator<ContainedClass> spliterator() {
return Arrays.spliterator(array);
}
}
答案 0 :(得分:3)
JDK中默认实现的最接近的东西:
Arrays.asList(array).iterator()
简单的自定义实现:
public final class ArrayIterator<E> implements Iterator<E> {
private final E[] _elements;
private int _index;
@SafeVarargs
public ArrayIterator(final E... elements) {
_elements = Objects.requireNonNull(elements);
}
public boolean hasNext() {
return _index < _elements.length;
}
public E next() {
if (hasNext()) {
return _elements[_index++];
}
throw new NoSuchElementException();
}
public void remove() {
throw new UnsupportedOperationException();
}
}
答案 1 :(得分:0)
已经pointed out,您可以简单地使用Arrays.asList(array).iterator()
来创建数组迭代器。临时列表是一个轻量级的包装器,无需担心。
或者,您可以使用等效的Arrays.stream(array).iterator();
。使用Arrays.stream(array)
代替Arrays.asList(array)
的优势在于,重载Arrays.stream(T[] array, int startInclusive, int endExclusive)
与Arrays.spliterator
类似,因此如果您需要处理一系列范围,则不会发生重大变化阵列。