Object(T [])数组的默认迭代器实现?

时间:2014-08-21 18:23:06

标签: java arrays iterator java-8

我有一个类看起来像下面的代码。它实现了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);
    }
}

2 个答案:

答案 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类似,因此如果您需要处理一系列范围,则不会发生重大变化阵列。