6

我正在为第三方 API 提供一些外观类,我需要包装一个迭代器,以便我可以用我自己的外观对象替换迭代的内容。

这是我的外观类的简化版本,它包装了一个名为Item的 API 类

class FacadeItem {
    Item item;
    FacadeItem(Item item) {
        this.item = item;
    }
}

API 提供了这种形式的迭代器Iterator<Item>

我需要实现Iterator<FacadeItem>由 API 的迭代器支持的这种形式的迭代器。

我考虑使用 Guava 库中的ForwardingIterator如下:

class FacadeItemIterator<FacadeItem> extends ForwardingIterator<Item> {

    final Iterator<Item> delegate; // backing iterator

    FacadeItemIterator(Iterator<Item> delegate) {
        this.delegate = delegate;
    }

    @Override protected Iterator<Item> delegate() {
        return delegate;
    }

    @Override
    public FacadeItem next() {
        return new FacadeItem(super.next());
    }
}

next()但是编译器不允许Override ,因为它期望返回的类型是Item,而不是FacadeItem

4

1 回答 1

15

接口不是那么大Iterator,所以你可以编写自己的委托迭代器:

class FacadeIterator implements Iterator<FacadeItem> {
    private final Iterator<Item> delegate; // set in ctor

    @Override
    public FacadeItem next() {
        return new FacadeItem(delegate.next());
    }

    // the other two methods just delegate straight
}

进而

Iterator<FacadeItem> facadeIterator = new FacadeIterator(itemIterator);

如果您使用 Guava,您可以使用他们的Iterators.transform静态方法为您制作其中之一:

Iterator<FacadeItem> facadeIterator = Iterators.transform(itemIterator,
    /* anon class of Function<Item, FacadeItem> */);

而在 Java 1.8 中,这个选项变得非常简单:

Iterator<FacadeItem> facadeIterator
    = Iterators.transform(itemIterator, FacadeItem::new)
于 2014-05-16T00:27:23.070 回答